Hak akses

Perizinan

Izin adalah kunci string hirarkis case-insensitive yang digunakan untuk menentukan apakah Subjek bisa melakukan tindakan tertentu atau tidak. String dibagi menjadi bagian yang terpisah dengan menggunakan karakter titik. Izin harus terstruktur seperti ini.

<PluginID>.<MainGroup>.<Subgroup1>...

Karakter yang diperbolehkan adalah:

  • "A" - "Z"

  • "a" - "z"

  • "0" - "9"

  • "_"

  • "-"

  • "."

Warisan

Jika seorang pengguna memiliki izin myPlugin.commands kemudian mereka akan secara otomatis memiliki izin yang lain seperti myPlugin.commands.teleport kecuali kalau izin secara eksplisit dihapus.

Catatan

Tidak ada sesuatu izin khusus seperti sebuah myPlugin.commands.*. Gunakan myPlugin.commands untuk itu.

Struktur-Contoh

Contoh berikut menunjukkan salah satu cara yang mungkin penataan izin, tapi berikut ini struktur tidak diperlukan sama sekali.

  • myPlugin
    • Hibah penuh akses ke semua izin plugin.

  • myPlugin.commands
    • Hibah penuh akses ke semua perintah plugin.

  • myPlugin.commands.teleport.execute
    • Hanya pengguna dengan izin untuk mengeksekusi perintah. Tanpa izin ini dia tidak mampu untuk mengeksekusi perintah bahkan jika ia memiliki teleport permissions. (Dengan izin ini sendiri pengguna hanya akan dapat untuk teleport dirinya untuk orang lain di dunia saat ini.)

  • myPlugin.commands.teleport.all
    • Hanya pengguna dengan izin untuk teleport ke seluruh dunia.

  • myPlugin.commands.teleport.worlds
    • Hanya pengguna dengan izin untuk teleport ke seluruh dunia.

  • myPlugin.commands.teleport.worlds.mynetherworld
    • Hanya memberi izin kepada pengguna untuk teleport ke mynetherworld.

IzinDeskripsi

The PermissionDescription adalah utilitas yang dimaksudkan untuk memberi pemilik serverdengan rincian tentang izin tertentu. `` PermissionDescription`` s adalah fitur opsional a PermissionService dapat memberikan. Pembuatan PermissionDescription tidak ** tidak memiliki dampak apakah izin ada, siapa yang memiliki akses atau nilai defaultnya.

Deskripsinya terdiri dari:

  • id izin target

  • deskripsi teks

  • satu atau lebih peran yang ditugaskan

  • plugin yang memiliki

Jika Anda memiliki elemen dinamis seperti `` World`` atau `` ItemType`` maka Anda dapat menggunakan `` <TemplateParts> ``.

Contoh penggunaan

import org.spongepowered.api.service.permission.PermissionDescription;
import org.spongepowered.api.service.permission.PermissionDescription.Builder;
import org.spongepowered.api.service.permission.PermissionService;
import org.spongepowered.api.text.Text;
import java.util.Optional;

Optional<Builder> optBuilder = permissionService.newDescriptionBuilder(myPlugin);
if (optBuilder.isPresent()) {
    Builder builder = optBuilder.get();
    builder.id("myPlugin.commands.teleport.execute")
           .description(Text.of("Allows the user to execute the teleport command."))
           .assign(PermissionDescription.ROLE_STAFF, true)
           .register();
}

Hasil yang sederhana

myPlugin.commands.teleport.execute

Description: Allows the user to execute the teleport command.
Role: user
Owner: MyPlugin v1.2.3

Hasil Template

myPlugin.commands.teleport.worlds.<World>

Description: Allows the user to teleport to the world <World>.
Role: staff
Owner: MyPlugin v1.2.3

Tip

Anda bisa melewatkan deskripsi tulisan untuk beberapa izin kelompok orangtua seperti myPlugin.commands.teleport.worlds atau myPlugin.commands sebagai makna bahwa bisa diturunkan dari struktur perizinan dan anak-anak yang didefinisikan sendirian.

Perihal

A Subject adalah pemegang izin yang diberikan. Ini bisa didapat dari `` PermissionService`` via SubjectCollections. CommandSources seperti Players adalah `` Subject``s secara default, namun ada banyak jenis `` Subject`` s lainnya. Apa pun yang memiliki izin adalah Subjek meskipun hanya mendelegasikan cek ke Subjek yang tercantum. Izin dapat diberikan atau ditolak ke Subjek. Jika izin tidak diberikan atau ditolak, pengaturannya akan diwariskan. Lihat Warisan. Subjek memberikan metode untuk memeriksa apakah mereka memiliki izin tertentu atau tidak. Plugin yang menggunakan metode ini hanya boleh meminta izin khusus yang ingin mereka periksa. Ini adalah tugas PermissionService untuk menghormati izin dan pewarisan subjek.

Contoh

Contoh berikut dapat digunakan untuk memeriksa apakah Pemain diizinkan untuk menjalankan perintah teleport.

import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.world.World;

public boolean canTeleport(Player subject, World targetWorld) {
    return subject.hasPermission("myPlugin.command.teleport.execute")
            && (subject.getWorld() == targetWorld
                    || subject.hasPermission("myPlugin.command.teleport." + targetWorld.getName()));
}

Warisan

Jika `` Subjek`` memiliki izin yang diberikan, maka akan menggunakan nilai tersebut. Jika tidak maka akan diwarisi dari parent `` Subject``. Tidak masalah jenis orang tua (misalnya kelompok atau pemain) `` Subjek`` yang mungkin ada.

Jika subjek atau subjek orang tua tidak memberikan atau menolak izin maka ia akan diwarisi dari default `` Subject``s. Setiap `` SubjectCollection`` mendefinisikan default-nya sendiri. Subjek default global dan terlemah dapat diperoleh dari `` PermissionService``. Plugin dapat menentukan hak akses mereka sendiri ke transien default SubjectData selama setiap server dimulainya. Hal ini memungkinkan pemilik server untuk menimpa default yang ditentukan oleh plugin sesuai dengan kebutuhan mereka dengan menggunakan default `` SubjekData` yang tetap. Jika Anda ingin memberikan panduan konfigurasi untuk pemilik server gunakan `` PermissionDescription``'s peran-template sebagai gantinya.

Peringatan

Kamu harus berpikir hati-hati sebelum memberikan izin default kepada pengguna. Dengan memberikan izin, Anda menduga bahwa semua pemilik server menginginkan default ini (setidaknya saat pertama plugin berjalan) dan pengecualian tersebut mengharuskan pemilik server untuk secara eksplisit menolak izin (yang bahkan tidak dapat dilakukan tanpa layanan perizinan khusus pelaksanaan). Ini kira-kira sesuai dengan tamu di dunia lan pemain tunggal tanpa menipu. Misalnya plugin chat akan memungkinkan pengiriman pesan chat secara default untuk meniru perilaku permainan vanilla untuk fitur yang telah diubah oleh plugin.

Catatan

Subjek default `` Subjek``s 'persistent `` SubjectData``s diutamakan daripada yang sementara. Untuk semua `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `.

Jika Subjek, maupun orang tuanya, atau bawahannya memberi nilai pada sebuah izin, maka secara otomatis ditolak.

Catatan

Urutan prioritas dalam urutan menurun:

  • Bidang subjek
    • Sementara

    • Kegigihan

  • Subjek Orangtua
    • Sementara

    • Kegigihan

  • Default SubjekCollection
    • Kegigihan

    • Sementara

  • PermissionService Defaults
    • Kegigihan

    • Sementara

  • Menolak izin

SubjectCollections

Sebuah wadah untuk subyek yang dapat digunakan untuk mendapatkan Subjek dengan nama. Ini adalah Koleksi Perihal default:

  • Pengguna
    • Berisi semua on-line `` Player``s dan all off-line `` User`` s (setidaknya mereka yang tidak memiliki pengaturan default).

  • Kelompok
    • Berisi semua grup `` Subject``. Grup adalah cara sederhana untuk menyusun sebuah pohon warisan `` Subject`` 's dengan nama `` Subject``s. Grup harus digunakan jika subset khusus \s Subjek memiliki pengaturan izin tambahan seperti tim, fraksi, atau peran.

  • Sistem
    • Berisi bahasa `` Subject``s lain yang digunakan oleh server seperti konsol dan konsol jarak jauh yang mungkin.

  • Blok Perintah
    • Berisi semua `` Subject``s untuk blok perintah. Ini berguna jika Anda ingin menjalankan `` CommandBlock`` hanya dengan hak akses pencipta.

  • Role Template
    • Berisi semua subyek template peran yang digunakan di `` PermissionDescription``s. Berguna untuk mencari semua izin yang direkomendasikan bagi pengguna. Ini tidak boleh digunakan untuk warisan.

Catatan

Ketika `` SubjectCollection``s ditanya untuk `` Subjek`` mereka akan secara otomatis dibuat, jika mereka belum ada. Namun mungkin tidak selalu muncul di `` getAllSubjects () `` kecuali jika tidak ada nilai default yang ditetapkan.

SubjectData

SubjectData adalah toko izin sebenarnya yang terhubung ke Subjek. Ada dua jenis toko Subjek:

  • Sementara = Hanya berlangsung selama sesi berlangsung, tidak pernah disimpan

  • Biasa (gigih) = Mungkin diselamatkan entah di mana, dan karena itu bertahan dan bertahan selamanya. Yang direkomendasikan untuk `` PermissionService`` s untuk menerapkan toko persisten, namun ini bukan keharusan. Mungkin juga tergantung pada tipe subjek. Jika tidak ada ketekunan maka toko sementara akan dikembalikan pada kedua metode tersebut.

Penulis plugin sebaiknya mempertimbangkan atau perlu mempertahankan harga saat memilih di antara mereka.

  • Jika hanya untuk waktu yang singkat (misalnya saat minigame) gunakan yang sementara.

  • Jika sudah lama atau lama (misalnya promosi ke VIP) gunakan yang reguler (persisten).

Silakan merujuk ke bagian Warisan jika ingin mengetahui lebih banyak tentang warisan dan prioritas dari SubjectData`s sementara dan sementara.

Pilihan subjek

Subjek juga menyediakan kemungkinan untuk menyimpan opsi string. Ini pada dasarnya adalah pasangan nilai kunci yang dapat ditugaskan dan diwariskan. Tidak seperti string izin, kunci tidak hierarkis dan tidak memberikan mekanisme pewarisan sendiri, tetapi pasangan nilai kunci itu sendiri diwarisi dari orang tua Subjects dengan cara yang sama dengan izin.

Konteks

Jika Anda mempertimbangkan setiap izin untuk mendapatkan hak istimewa atau kemampuan untuk dapat melakukan sesuatu, a :javadoc:`Konteks` adalah keadaan di mana hak istimewa tersebut dapat digunakan.

Anda mungkin ingin memberi izin ``Subject``untuk melakukan sesuatu, namun hanya jika `` Subjek` berada di dunia tertentu, atau di wilayah tertentu.

Konteks diakumulasikan oleh `` Subjek``, dan kemudian digunakan oleh `` PermissionService`` untuk memutuskan apakah Subject memiliki hak istimewa atau tidak.

Sponge menyediakan beberapa konteks secara default, namun umumnya turun ke plugin lain untuk memberikan konteks tambahan ke PermissionService, melalui ContextCalculator.

Saat membuat konteks untuk plugin Anda sendiri, cobalah menghindari konflik dengan plugin lain (mis. Dengan awalan tombol konteks dengan id plugin Anda) kecuali konteks ini dimaksudkan untuk dibagikan.

Catatan

Pastikan bahwa `` ContextCalculator` Anda merespons secepat mungkin karena akan sering dipanggil.

Contoh

`` ContextCalculator` Anda mungkin terlihat seperti ini:

import org.spongepowered.api.command.CommandSource;
import org.spongepowered.api.service.context.Context;
import org.spongepowered.api.service.context.ContextCalculator;
import org.spongepowered.api.service.permission.Subject;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

public class ExampleCalculator implements ContextCalculator<Subject> {

    private static final Context IN_ANY_ARENA = new Context("myArenaPlugin-inAnyArena", "true");
    private static final Context NOT_ANY_ARENA = new Context("myArenaPlugin-inAnyArena", "false");
    private static final String ARENA_KEY = "myArenaPlugin-arena";

    private final Map<UUID, String> playerArenas = new HashMap<>();

    @Override
    public void accumulateContexts(Subject calculable, Set<Context> accumulator) {
        final Optional<CommandSource> commandSource = calculable.getCommandSource();

        if (commandSource.isPresent() && commandSource.get() instanceof Player) {
            final Player player = (Player) commandSource.get();

            final UUID uuid = player.getUniqueId();
            if (this.playerArenas.containsKey(uuid)) {
                accumulator.add(IN_ANY_ARENA);
                accumulator.add(new Context(ARENA_KEY, this.playerArenas.get(uuid)));
            } else {
                accumulator.add(NOT_ANY_ARENA);
            }
        }
    }

    @Override
    public boolean matches(Context context, Subject subject) {
        if (!context.equals(IN_ANY_ARENA) && !context.equals(NOT_ANY_ARENA) && !context.getKey().equals(ARENA_KEY)) {
            return false;
        }

        final Optional<CommandSource> commandSource = subject.getCommandSource();
        if (!commandSource.isPresent() || !(commandSource.get() instanceof Player)) {
            return false;
        }

        final Player player = (Player) commandSource.get();

        if (context.equals(IN_ANY_ARENA) && !this.playerArenas.containsKey(player.getUniqueId())) {
            return false;
        }

        if (context.equals(NOT_ANY_ARENA) && this.playerArenas.containsKey(player.getUniqueId())) {
            return false;
        }

        if (context.getKey().equals(ARENA_KEY)) {
            if (!this.playerArenas.containsKey(player.getUniqueId())) {
                return false;
            }

            if (!this.playerArenas.get(player.getUniqueId()).equals(context.getValue())) {
                return false;
            }
        }

        return true;
    }
}

`` ContextCalculator`` dapat didaftarkan melalui:

permissionService.registerContextCalculator(contextCalculator);