Hak akses

Peringatan

These docs were written for SpongeAPI 7 and are likely out of date. If you feel like you can help update them, please submit a PR!

If you are interested in the permissions that are used in vanilla commands have a look at this page. For customizing the permission levels refer to the server permissions page or your permission plugin's documentation.

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
    • Only grants the user the permission to execute the command. Without this permission he is not able to execute the command even if he has other teleport permissions. (With this permission alone, the user would only be able to teleport himself to others in his current world.)

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

  • myplugin.commands.teleport.all
    • 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 net.kyori.adventure.text.Component;
import org.spongepowered.api.service.permission.PermissionDescription;
import org.spongepowered.api.service.permission.PermissionDescription.Builder;
import org.spongepowered.api.service.permission.PermissionService;

PluginContainer plugin = ...;
Builder builder = permissionService.newDescriptionBuilder(plugin);

builder.id("myplugin.commands.teleport.execute")
       .description(Component.text("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

You should think carefully before granting default permissions to users. By granting the permissions you are assuming that all server owners will want these defaults (at least the first time the plugin runs) and that exceptions will require server owners to explicitly deny the permissions (which can't even be done without a custom permissions service implementation). This should roughly correspond to a guest on a single player lan world without cheats. For example, a chat plugin would allow sending chat messages by default to imitate vanilla game behavior for features that were changed by the 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
    • Contains other Subjects used by the server such as the console and possible remote consoles.

  • 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.

Contoh

The following example could be used to give a player a permission with global context and a true value

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

public void setPermission(Player player, String permission) {
    if(!player.hasPermission(permission)
        player.getSubjectData().setPermission(SubjectData.GLOBAL_CONTEXT, permission, Tristate.TRUE);
}

Catatan

In the above example Tristate.TRUE was used but you can also use Tristate.FALSE for a false permission and Tristate.UNDEFINED to unset the permission entirely.

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

Please make sure that your ContextCalculator responds as fast as possible as it will get called frequently.

Peringatan

ContextCalculator implementations must be thread safe, because they may be called from outside of the main thread, or even called in parallel. For to this reason, all non-name or non-uuid based ContextCalculators (such as location-based ones) have to utilize a cache and must be to be updated using event listeners or synchronized schedulers.

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.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

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 ConcurrentHashMap<>();

    @Override
    public void accumulateContexts(Subject subject, Set<Context> accumulator) {
        CommandSource commandSource = subject.getCommandSource().orElse(null);

        if (commandSource instanceof Player) {
            UUID uuid = ((Player) commandSource).getUniqueId();

            String arena = this.playerArenas.get(uuid);
            if (arena != null) {
                accumulator.add(IN_ANY_ARENA);
                accumulator.add(new Context(ARENA_KEY, arena));
            } else {
                accumulator.add(NOT_ANY_ARENA);
            }
        }
    }

    @Override
    public boolean matches(Context context, Subject subject) {
        CommandSource commandSource = subject.getCommandSource().orElse(null);

        if (commandSource instanceof Player) {
            UUID uuid = ((Player) commandSource).getUniqueId();

            if (context.equals(IN_ANY_ARENA)) {
                return this.playerArenas.containsKey(uuid);
            } else if (context.equals(NOT_ANY_ARENA)) {
                return !this.playerArenas.containsKey(uuid);
            } else if (context.getKey().equals(ARENA_KEY)) {
                return context.getValue().equals(this.playerArenas.get(uuid));
            }
        }

        return false;
    }

}

`` ContextCalculator`` dapat didaftarkan melalui:

permissionService.registerContextCalculator(contextCalculator);

Untuk Forge Mods

Jika anda ialah penulis modern Menempa dan tidak menggunakan IzinAPI Menempa yang baru namun melakukan memeriksa OP, maka anda telah berada di jalur yang tepat untuk Sponge untuk mengambil izin.

Cara termudah untuk membuat izin Sponge dalam bentuk Forge tanpa lembut - tergantung pada SpongeAPI adalah dengan menggunakan metode yang diberikan oleh kode Vanilla Minecraft di `` ICommandSender``, yaitu `` ICommandSender.canCommandSenderUseCommand (int permLevel, String commandName) ``. String yang dilewatkan ke metode itu sama sekali tidak berguna sama sekali di lingkungan Vanilla Forge, namun saat SpongeForge ditambahkan, secara otomatis String tersebut mengambilnya dan mengubahnya menjadi izin kerja.

Contoh

public class AwesomeBlock extends Block {
    @Override
    public boolean onBlockActivated(World world, BlockPos pos, IBlockState state,
            EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
        if (player.canUseCommand(4, "examplemod.awesomeblock.interact")) {
            // Do cool stuff
            return true;
        }
        return false;
    }
}

Seperti yang Anda lihat, kami hanya memeriksa tingkat OP dan lulus dalam String sewenang-wenang yang ingin kami gunakan sebagai izin saat Sponge digunakan. Ketika Forge digunakan dengan sendirinya, pemain hanya memerlukan tingkat OP, sehingga melewatkan nilai 0 akan memungkinkan semua pengguna berinteraksi dengan blok tersebut, namun saat SpongeForge ditambahkan, mereka memerlukan simpul izin `` examplemod.awesomeblock.interact``. Dianjurkan untuk mengikuti struktur izin seperti dijelaskan di atas. Warisan izin juga berlaku untuk pemeriksaan ini.

Catatan

Nama SRG untuk metode ini adalah `` func_70003_b``.