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

Not

`myplugin.commands.*``vahşi kart izni diye bir şey yoktur. Bunun için ``myplugin.commands``ı kullanınız.

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ı:

  • Kullanıcı
    • Bütün çevrimiçi ``Player``ları ve bütün çevrimdışı ``User``ları (en azından varsayılan ayarlı olmayanlar) içerir.

  • Grup
    • Bütün Subject gruplarını içerir. Gruplar adlandırılmış ``Subject``leri kullanan kalıtım ağacı ``Subject``lerini oluşturmanın basit bir yoludur. Gruplar eğer belli bir ``Subject``alt kümesinin takım, grup veya görev gibi fazladan izni varsa kullanılmalıdır.

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