İzinler
İzin
İzin, büyük/küçük harf duyarlı olmayan bir konunun belirli bir işlemi yapıp yapamayacağını belirlemek için kullanılan, hiyerarşik bir dize anahtarıdır. Dize, ayrı parçalara nokta karakterini kullanarak bölünür. İzinler şu şekilde planlanmalıdır.
<PluginID>.<MainGroup>.<Subgroup1>...
İzin verilen karakterler:
“A” - “Z”
“a” - “z”
“0” - “9”
“_”
“-”
“.”
Kalıtım
Bir kullanıcının izni varsa myplugin.commands``bunlar gibi otomatik olarak tüm alt izinlere sahip olurlar
``myplugin.commands.teleport
izinler açıkça kaldırılmadığı sürece.
Yapı-Örnek
Aşağıdaki örnek, izinleri yapılandırmanın olası bir yolunu göstermektedir, ancak bu yapıyı izlemek hiç gerekli değildir.
myplugin
Grantların tüm eklenti izinlerine erişimleri vardır.
- myplugin.commands`
Grantların tüm eklenti komutlarına erişimi vardır.
myplugin.commands.teleport.execute
Yalnızca kullanıcıya komutu yürütme iznini verir. Bu izin olmaksızın, başka bir ‘teleport’ izni olsa bile komutu yürütemez. (Yalnız bu izinle kullanıcı şu andaki dünyasında kendisini başkalarına teleport edebilecektir.)
myplugin.commands.teleport.all
Kullanıcıya sadece tek seferde tüm oyuncuları ışınlama iznini verir.
myplugin.commands.teleport.worlds
Kullanıcıya sadece tüm dünyalara ışınlanabilme izni verir.
myplugin.commands.teleport.worlds.mynetherworld
Kullanıcıya sadece mynetherworld’e ışınlanabilme izni verir.
PermissionDescription
:javadoc:`PermissionDescription belli bir izinde detaylı bir sunucu sağlamayı amaçlayan bir hizmet programı yazılımıdır. ``PermissionDescription``ları bir :javadoc:`PermissionService`in sağlayabileceği opsiyonel bir özelliktir. Bir PermissionDescription oluşturmanın iznin var olup olmadığı,kimin erişimi olduğu veya varsayılan değerinin ne olduğuna hiç bir etkisi yoktur.
Açıklamanın içeriği:
hedef izin kimliği
Bir metin açıklaması
bir veya daha fazla atanan rol
sahip olma eklentisi
Eğer World
veya ItemType
gibi dinamik bir öğeniz varsa, o halde <TemplateParts>
kullanabilirsiniz.
Kullanım örnekleri
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();
}
Basit-Sonuç
myplugin.commands.teleport.execute
Description: Allows the user to execute the teleport command.
Role: user
Owner: MyPlugin v1.2.3
Basit-Sonuç
myplugin.commands.teleport.worlds.<World>
Description: Allows the user to teleport to the world <World>.
Role: staff
Owner: MyPlugin v1.2.3
Tüyo
Anlamı yalnızca izin yapısı olan ve tanımlanmış alt yetki türetilebileceğinden “myPlugin.commands.teleport.worlds` veya” myPlugin.commands ” gibi bazı üst izin gruplarına yönelik açıklamaları atlayabilirsiniz.
Başlık
A :javadoc:`Subject`atanan izinlerin tutucusudur. ``PermissionService``den :javadoc:`SubjectCollection`ları yoluyla alınabilir.:javadoc:`Player` gibi :javadoc:`CommandSource`lar varsayılan olarak``Subject``lerdir ama daha başka bir çok türde ``Subject``ler vardır. İzne sahip olan her şey sadece sınırlı Subject kontrollerini temsil etse bile bir Subject’dir. Subjecte izinler verilebilir veya reddedilebilir.Eğer izin ne verilmiş ne reddedilmişse ayarları bir başkası için devredilir.Inheritance’a bakın.Subject’ler belli bir izinleri olup olmadığını kontrol etmek için yöntemler sunarlar.Bu yöntemi kullanan eklentiler sadece kontrol etmek istedikleri belli başlı izinleri sorgulamalıdır.
Örnek
Aşağıdaki örnek, Player’ın teleport komutu yürütmesine izin verilip verilmediğini kontrol etmek için kullanılabilir.
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()));
}
Kalıtım
Eğer bir Subject``e atanmış bir izin varsa, o değeri kullanacaktır. Aksi halde, herhangi bir kaynak ``Subject
’ten devralınacaktır. Hangi tür kaynağın (örneğin, grup veya oyuncu) Subject
olabileceği önemli değildir.
Ne özne ne de ebeveynlerin herhangi biri, izin vermez veya reddederse, o zaman varsayılan olarak``Subject``alınacaktır. Her SubjectCollection
kendi varsayılanına sahiptir. Küresel ve en zayıf varsayılan tema PermissionService
’den alınabilir Her başlatma işlemi esnasında eklentiler SubjectData ile kendi izinlerinin varsayılan öntanımlı olarak atayabilir. Sunucu sahiplerinin varsayılan olarak kalıcı SubjectData
kullanarak ihtiyaçlarına göre eklentiler tarafından tanımlanan varsayılanların üzerine yazmalarını sağlar. Sunucu sahipleri için bir yapılandırma rehberi sunmak isterseniz bunun yerine PermissionDescription
’ın rol şablonlarını kullanın.
Uyarı
Kullanıcılara varsayılan yetkiler vermeden önce dikkatlice düşünmeniz gerekir. İzinleri vererek, tüm sunucu sahiplerinin bu varsayılanları (en azından eklentinin ilk çalıştırdığı zamanı) isteyeceğini varsayıyoruz ve bu istisnalar, sunucu sahiplerinin izinleri açıkça reddetmesini gerekiyor (izinleri özel bir izin servisi olmadan bile gerçekleştirilemiyor) uygulama). Bu kabaca, hile yapmadan tek bir oyuncunun lan dünyasında bir konuğa karşılık gelmesidir. Örneğin, sohbet eklentisi, eklenti tarafından değiştirilen özellikler için varsayılan olarak sohbet mesajlarının gönderilmesine izin vererek vanilla oyun davranışını taklit eder.
Not
Varsayılan ``Subject``lerin kalıcı ``SubjectData``larının geçici olanlara göre önceliği vardır. Diğer tüm ``Subject``ler için ise geçici ``SubjectData``nın kalıcı olanlara göre üstünlüğü vardır.
Eğer ne konu ne de konunun kaynaklarının hiçbiri veya varsayılanlar bir izne bir değer atamazsa izin otomatik olarak reddedilir.
Not
Azalan sırayla öncelik sırası:
- Konunun kendisi
Geçici
Kalıcı
- Ana konular
Geçici
Kalıcı
- Konu Koleksiyonu Varsayılanları
Kalıcı
Geçici
- İzin Servis Varsayılanları
Kalıcı
Geçici
Izin vermeyi reddet
SubjectCollections
İsme göre bir Konu elde etmek için kullanılabilecek konular için bir konteyner. Bunlar varsayılan Konu Koleksiyonları:
- Sistem
Konsol ve olası uzaktan kumanda gibi sunucu tarafından kullanılan diğer ``Subject``leri içerir.
- Komut bloğu
Komut engeli için tüm
Subject``leri içerir.Bunlar eğer sadece oluşturucunun izniyle bir ``CommandBlock
çalıştırmak isterseniz faydalıdır.
- Rol şablonu
`` PermissionDescription`` s’de kullanılan tüm rol şablonu konularını içerir. Bir kullanıcı için önerilen tüm izinleri bulmakta kullanışlıdır. Bunlar devralma için kullanılmamalıdır.
Not
SubjectCollection``lar bir ``Subject
için sorgulandığında eğer çoktan mevcut değillerse otomatik olarak oluşturulacaklardır. Ancak varsayılan olmayan değerler ayarlanmadığı takdirde kesin olarak``getAllSubjects()``de görünmeyebilirler.
SubjectData
SubjectData, konuya bağlı olan gerçek bir izin deposudur. İki tür konu mağazası vardır:
Geçici = Sadece oturumun süresi boyunca sürer, hiçbir zaman kaydedilmez
Düzenli (sürekli) = Bir yere kaydedilmiş ve bu yüzden depolamayı sürdürmüş ve sonsuza kadar var olmuş olabilir. Bu kalıcı bi belleğe uygulamak amacıyla
PermissionService
için önerilir ancak bu bir gereklilik değildir. Bu konunun türüne de bağlı olabilir. Eğer kalıcılık yoksa o zaman geçici bellek her iki yöntemle de geri dönmüş olacaktır.
Eklenti yazarları, aralarında seçim yaparken bir değeri sürdürmeye gerek olup olmadığını düşünmelidir.
Kısa bir süre için (ör. Bir minigame sırasında) ise, geçici olanını kullanın.
Eğer uzun süredir veya sonsuza kadar sürecekse (örn. VIP için bir promosyon) normal (sürekli) olanı kullanılır.
Geçici ve sürekli ``SubjectData``ların kalıtım özelliği ve önceliği ile ilgili daha fazla bilgiye sahip olmak istiyorsanız lütfen Kalıtım Özelliği bölümüne bakın.
Konu Seçenekleri
Konular ayrıca satır seçeneklerini saklamak için olanak sağlar. Bunlar basit olarak atanabilen ve devralınabilen anahtar değer çiftleridir. İzin satırlarının aksine, anahtarlar hiyerarşik değildir ve herhangi bir devretme mekanizması sağlamazlar, ancak anahtar değer çiftlerinin kendileri, izinlerin verildiği şekilde Subject
s’ den devralınır.
Bağlamlar
Eğer siz her izni ayrıcalık veya birşey yapabilme kabiliyeti olarak düşünürseniz, bir Context bu ayrıcalıkların kullanılabilir olduğu koşullardır.
Bir şeyler yapmak için bir Subject``izni vermek isteyebilirsiniz yalnız sadece ``Subject
belli bir dünyada veya belli bir bölgede olduğunda yapabilirsiniz.
İçerikler Subject
tarafından biriktirilir ve sonra Subject``in ayrıcalığı olup olmadığına karar vermek için ``PermissionService
tarafından kullanılır.
Sponge bir takım varsayılan içerikler sağlar ama genel olarak ContextCalculator kanalıyla PermissionService’e ek içerikler sağlamak için diğer eklentilerin altındadır.
Eğer bu içerikler paylaşılmak isteniyorsa lütfen kendi eklentilerinizi oluştururken diğer eklentilerle çakışmasından kaçının (Örneğin eklenti kimliğinizle birlikte içerik anahtarını önüne ekleyerek.).
Not
Sıklıkla çağırılacağı için lütfen ``ContextCalculator``ınızın olabildiğince hızlı cevap verdiğinden emin olun.
Örnek
``ContextCalculator``ınız böyle görünebilir:
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
şu yollarla kaydedilebilir:
permissionService.registerContextCalculator(contextCalculator);
Modları Düzenlemek İçin
Bir Forge modunun yazarıysanız ve yeni Forge PermissionsAPI’sini kullanmıyorsanız, ancak OP kontrollerini yapıyorsanız, o zaman Sponge’ın izinleri alması için zaten doğru yoldasınız demektir.
SpongeAPI’ye bağlı olmayan Forge modunda bir Sponge izni oluşturmak için en basit yol, `` ICommandSender`` içindeki Vanilla Minecraft kodunun sağladığı yöntemi kullanmaktır, yani `` ICommandSender.canCommandSenderUseCommand (int permLevel, String commandName) ``. Bu metoda geçirilen dize, Vanilla Forge ortamında hiç bir kullanıma sahip değildir, ancak SpongeForge eklendiğinde otomatik olarak o dizeyi alır ve bir çalışma iznine dönüştürür.
Örnek
public class AwesomeBlock extends Block {
@Override
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) {
if (player.canCommandSenderUseCommand(4, "examplemod.awesomeblock.interact")) {
// Do cool stuff
return true;
}
return false;
}
}
Görebildiğiniz gibi OP seviyesini kontrol ettik ve Sponge kullanıldığında izin olarak kullanmak istediğiniz rastgele bir Dize’yi gönderiyoruz. Forge kendi başına kullanıldığında, oyuncu sadece OP seviyesini gerektirir, bu nedenle 0 değeri geçmek tüm kullanıcıların blokla etkileşime girmesine izin verir, ancak SpongeForge eklendiğinde `` examplemod.awesomeblock.interact`` izin düğümünü gerektirir.. Yukarıda açıklandığı gibi izin yapısına uyulması önerilir. İzin devralma bu kontroller için de geçerlidir.
Not
Bu yöntem için SRG adı func_70003_b
.