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 Subject
s 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);