Moralis 角色

2022-05-11 14:30 更新

隨著您的應(yīng)用程序范圍和用戶群的增長,您可能會發(fā)現(xiàn)自己需要對數(shù)據(jù)片段的訪問進行更粗粒度的控制,而用戶鏈接的 ACL 無法提供這些控制。為了滿足這一要求,Moralis 支持一種“基于角色的訪問控制”形式。角色提供了一種對擁有 Moralis 數(shù)據(jù)的公共訪問權(quán)限的用戶進行分組的邏輯方式。角色是包含用戶和其他角色的命名對象。授予角色的任何權(quán)限都隱式授予其用戶以及它包含的任何角色的用戶。

例如,在您的包含策劃內(nèi)容的應(yīng)用程序中,您可能有許多被視為“版主”的用戶,可以修改和刪除其他用戶創(chuàng)建的內(nèi)容。您可能還擁有一組“管理員”用戶,并被授予與版主相同的所有權(quán)限,但也可以修改應(yīng)用程序的全局設(shè)置。通過將用戶添加到這些角色,您可以確保新用戶可以成為版主或管理員,而無需手動為每個用戶授予每個資源的權(quán)限。

我們提供了一個名為 ?Moralis.Role? 的專用類,它在您的客戶端代碼中表示這些角色對象。 ?Moralis.Role? 是 ?Moralis.Object? 的子類,具有所有相同的功能,例如靈活的模式、自動持久性和鍵值接口。 ?Moralis.Object? 上的所有方法也存在于 ?Moralis.Role? 上。不同之處在于 ?Moralis.Role? 有一些特定于角色管理的附加功能。

Moralis.Role 屬性

?Moralis.Role? 有幾個與 ?Moralis.Object? 不同的屬性:

  • ?name?:角色的名稱。 此值是必需的,并且只能在創(chuàng)建角色時設(shè)置一次。 名稱必須由字母數(shù)字字符、空格、- 或 _ 組成。 此名稱將用于標識角色,而不需要其 objectId。
  • ?users?:與將繼承授予包含角色的權(quán)限的用戶集的關(guān)系。
  • ?roles?:與角色集的關(guān)系,其用戶和角色將繼承授予包含角色的權(quán)限。

角色對象的安全性

?Moralis.Role? 使用與 Moralis 上的所有其他對象相同的安全方案 (ACL),但它需要顯式設(shè)置 ACL。 通常,只有具有極大提升權(quán)限的用戶(例如主用戶或管理員)才能創(chuàng)建或修改角色,因此您應(yīng)該相應(yīng)地定義其 ACL。 請記住,如果您為某個用戶授予 ?Moralis.Role? 寫入權(quán)限,則該用戶可以將其他用戶添加到該角色,甚至完全刪除該角色。

要創(chuàng)建一個新的 ?Moralis.Role?,您可以編寫:

// By specifying no write privileges for the ACL, we can ensure the role cannot be altered.
const roleACL = new Moralis.ACL();
roleACL.setPublicReadAccess(true);
const role = new Moralis.Role("Administrator", roleACL);
role.save();

您可以通過 ?Moralis.Role? 上的?users?和?roles?關(guān)系添加應(yīng)該繼承新角色權(quán)限的用戶和角色:

const role = new Moralis.Role(roleName, roleACL);
role.getUsers().add(usersToAddToRole);
role.getRoles().add(rolesToAddToRole);
role.save();

將 ACL 分配給您的角色時要格外小心,以便它們只能由應(yīng)該有權(quán)修改它們的人進行修改。

其他對象的基于角色的安全性

現(xiàn)在您已經(jīng)創(chuàng)建了一組在應(yīng)用程序中使用的角色,您可以將它們與 ACL 一起使用來定義其用戶將獲得的權(quán)限。 每個 ?Moralis.Object? 都可以指定一個 ?Moralis.ACL?,它提供了一個訪問控制列表,指示哪些用戶和角色應(yīng)該被授予對該對象的讀取或?qū)懭朐L問權(quán)限。

授予角色對對象的讀取或?qū)懭霗?quán)限非常簡單。 您可以使用 ?Moralis.Role?:

const moderators = /* Query for some Moralis.Role */;
const wallPost = new Moralis.Object("WallPost");
const postACL = new Moralis.ACL();
postACL.setRoleWriteAccess(moderators, true);
wallPost.setACL(postACL);
wallPost.save();

您可以通過為 ACL 指定角色名稱來避免查詢角色:

const wallPost = new Moralis.Object("WallPost");
const postACL = new Moralis.ACL();
postACL.setRoleWriteAccess("Moderators", true);
wallPost.setACL(postACL);
wallPost.save();

角色層次

如上所述,一個角色可以包含另一個角色,從而在兩個角色之間建立父子關(guān)系。 這種關(guān)系的結(jié)果是授予父角色的任何權(quán)限都隱式授予其所有子角色。

這些類型的關(guān)系通常出現(xiàn)在具有用戶管理內(nèi)容的應(yīng)用程序中,例如論壇。 一小部分用戶是管理員,對調(diào)整應(yīng)用程序的設(shè)置、創(chuàng)建新論壇、設(shè)置全局消息等具有最高級別的訪問權(quán)限。 另一組用戶是版主,他們負責確保用戶創(chuàng)建的內(nèi)容保持適當。 任何具有管理員權(quán)限的用戶也應(yīng)該被授予任何主持人的權(quán)限。 要建立這種關(guān)系,您可以讓您的管理員角色成為版主的子角色,如下所示:

const administrators = /* Your "Administrators" role */;
const moderators = /* Your "Moderators" role */;
moderators.getRoles().add(administrators);
moderators.save();


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號