許可權

許可權 只是儲存在 ObjectsAccounts 上的處理程式 permissions 中的文字字串。將其視為一種特殊的 Tag - 專門用於訪問檢查。因此它們經常與緊密耦合。許可權字串不區分大小寫,因此“Builder”與“builder”等相同。

許可權被用作建構存取層級和層次結構的便捷方法。它由 perm 指令設定,並由 PermissionHandler.check 方法以及特殊的 perm()pperm() lock 函式 檢查。

所有新帳戶都會獲得一組由 settings.PERMISSION_ACCOUNT_DEFAULT 定義的預設許可權。

超級使用者

嚴格來說Evennia中有兩種型別的使用者,超級使用者和其他人。的 超級使用者是您建立的第一個使用者,物件#1。這是全能的伺服器擁有者帳戶。 從技術上講,超級使用者不僅可以存取所有內容,還可以「繞過」許可權檢查 完全。

這使得超級使用者不可能lock出局,但卻不適合實際玩- 測試遊戲的鎖定和限制(請參閱下面的quell)。通常不需要有 但有一個超級使用者。

使用許可權

在遊戲中,您可以使用perm指令新增和刪除許可權

 > perm/account Tommy = Builders
 > perm/account/del Tommy = Builders

請注意 /account 開關的使用。這意味著您將許可權分配給帳戶 Tommy,而不是任何恰好名為「Tommy」的角色。如果您不想使用 /account,您也可以在名稱前加上 * 字首以指示正在尋找帳戶:

> perm *Tommy = Builders

在物件上放置許可權可能有原因(尤其是 NPCS),但為了向玩家授予權力,您通常應該在 Account 上放置許可權 - 這保證了它們被保留,無論他們目前正在操縱哪個角色。

從「層次結構樹」(見下文)分配許可權時,記住這一點尤其重要,因為帳戶的許可權將推翻其角色的許可權。因此,為了避免混淆,您通常應該將層次結構許可權放在帳戶上,而不是放在他們的角色/人偶上。

如果您_確實_想要開始使用_puppet_上的許可權,請使用 quell

> quell 
> unquell   

這會下降到傀儡物件的許可權,然後再次返回您的帳戶許可權。如果你想「像」別人一樣嘗試某件事,壓制是有用的。它對於超級使用者也很有用,因為這使他們容易受到鎖定的影響(因此他們可以測試事物)。

在程式碼中,您可以透過 PermissionHandler 新增/刪除許可權,該許可權位於所有許可權上 將實體型別分類為屬性 .permissions

    account.permissions.add("Builders")
    account.permissions.add("cool_guy")
    obj.permissions.add("Blacksmith")
    obj.permissions.remove("Blacksmith")

許可權層次結構

可以透過編輯元組將選定的許可權字串組織在許可權層次結構settings.PERMISSION_HIERARCHY。 Evennia的預設許可權層次如下 (依功率遞增順序):

 Guest            # temporary account, only used if GUEST_ENABLED=True (lowest)
 Player           # can chat and send tells (default level)
 Helper           # can edit help files
 Builder          # can edit the world
 Admin            # can administrate accounts
 Developer        # like superuser but affected by locks (highest)

(除了不區分大小寫之外,分層許可權還瞭解複數形式,因此您可以互換使用 DevelopersDeveloper)。

檢查分層許可權時(使用遵循的方法之一),您將透過您的等級及以下的檢查。也就是說,如果您擁有「Admin」分層許可權,您還將透過要求「Builder」、「Helper」等的檢查。

相比之下,如果您檢查非分層許可權,例如“鐵匠”,您必須“完全”擁有該許可權才能透過。

檢查許可權

需要注意的是,當您檢查傀儡 物件(如角色)的許可權時,檢查將始終首先使用連線到該物件的任何 Account 的許可權,然後再檢查該物件的許可權。在分層許可權(管理員、建構者等)的情況下,將始終使用帳戶許可權(這會阻止帳戶透過傀儡高階角色來升級其許可權)。如果要尋找的許可權不在層次結構中,則需要精確匹配,首先在帳戶上,如果在那裡找不到(或者如果沒有連線帳戶),則在物件本身上進行精確匹配。

用 obj.permissions.check() 檢查

檢查實體是否具有許可權的最簡單方法是檢查其 PermissionHandler,在所有型別分類實體上儲存為 .permissions

if obj.permissions.check("Builder"):
    # allow builder to do stuff

if obj.permissions.check("Blacksmith", "Warrior"):
    # do stuff for blacksmiths OR warriors

if obj.permissions.check("Blacksmith", "Warrior", require_all=True):
    # only for those that are both blacksmiths AND warriors

使用 .check 方法是可行的方法,它將採取分層 許可權進入帳戶,檢查帳戶/sessions等。

Warning

Don't confuse `.permissions.check()` with `.permissions.has()`. The .has()
method checks if a string is defined specifically on that PermissionHandler.
It will not consider permission-hierarchy, puppeting etc. `.has` can be useful
if you are manipulating permissions, but use `.check` for access checking.

Lock 函式

雖然 PermissionHandler 提供了一種檢查許可權的簡單方法,Lock strings 提供了一種迷你語言來描述如何存取某些內容。 perm() lock 函式 是使用鎖定中許可權的主要工具。

假設我們有一個 red_key 物件。我們也有想要的紅色寶箱 用這把鑰匙解鎖。

perm red_key = unlocks_red_chests

這為 red_key 物件授予了許可權「unlocks_red_chests」。接下來我們 lock我們的紅色寶箱:

lock red chest = unlock:perm(unlocks_red_chests)

當嘗試用這把鑰匙解鎖紅色寶箱時,寶箱Typeclass可能會 然後拿走鑰匙並進行訪問檢查:

# in some typeclass file where chest is defined

class TreasureChest(Object):

  # ...

  def open_chest(self, who, tried_key):

      if not chest.access(who, tried_key, "unlock"):
          who.msg("The key does not fit!")
          return
      else:
          who.msg("The key fits! The chest opens.")
          # ...

預設 perm lockfunc 有多種變體:

  • perm_above - 需要比一級許可權「更高」的層級許可權 假如。例:"edit: perm_above(Player)"

  • pperm - 查詢 Accounts 上的許可權,從不尋找任何傀儡 物件(無論是否分層燙髮)。

  • pperm_above - 類似於 perm_above,但僅適用於帳戶。

一些例子

新增許可權並檢查鎖

    account.permissions.add("Builder")
    account.permissions.add("cool_guy")
    account.locks.add("enter:perm_above(Player) and perm(cool_guy)")
    account.access(obj1, "enter") # this returns True!

具有連線帳戶的木偶範例:

    account.permissions.add("Player")
    puppet.permissions.add("Builders")
    puppet.permissions.add("cool_guy")
    obj2.locks.add("enter:perm_above(Accounts) and perm(cool_guy)")

    obj2.access(puppet, "enter") # this returns False, since puppet permission
                                 # is lower than Account's perm, and perm takes
                                 # precedence.

鎮壓

quell 指令可用於強制忽略 perm() lockfunc 帳戶上的許可權,而是使用角色上的許可權 僅。這個可以用e.g。由工作人員以較低許可權測試事物 水平。使用unquell返回正常操作。 請注意,平息將 使用帳戶或角色的任何分層許可權中最小的一個,因此 無法透過平息到高許可權來升級自己的帳戶許可權 性格。超級使用者也可以透過這種方式取消他們的權力,使他們 受鎖影響。