随着您的应用程序范围和用户群的增长,您可能会发现自己需要对数据片段的访问进行更粗粒度的控制,而用户链接的ACL无法提供这些控制。为了满足这一要求,Moralis支持一种“基于角色的访问控制”形式。角色提供了一种对拥有Moralis数据的公共访问权限的用户进行分组的逻辑方式。角色是包含用户和其他角色的命名对象。授予角色的任何权限都隐式授予其用户以及它包含的任何角色的用户。

例如,在您的包含策划内容的应用程序中,您可能有许多被视为“版主”的用户,可以修改和删除其他用户创建的内容。您可能还拥有一组“管理员”用户,并被授予与版主相同的所有权限,但也可以修改应用程序的全局设置。通过将用户添加到这些角色,您可以确保新用户可以成为版主或管理员,而无需手动为每个用户授予每个资源的权限。

我们提供了一个名为​Moralis.Role​的专用类,它在您的客户端代码中表示这些角色对象。​Moralis.Role​是​Moralis.Object​的子类,具有所有相同的功能,例如灵活的模式、自动持久性和键值接口。​Moralis.Object​上的所有方法也存在于​Moralis.Role​上。不同之处在于​Moralis.Role​有一些特定于角色管理的附加功能。

Moralis.Role属性

Moralis.Role​有几个与​Moralis.Object​不同的属性:

name​:角色的名称。此值是必需的,并且只能在创建角色时设置一次。名称必须由字母数字字符、空格、-或_组成。此名称将用于标识角色,而不需要其objectId。 ​users​:与将继承授予包含角色的权限的用户集的关系。 ​roles​:与角色集的关系,其用户和角色将继承授予包含角色的权限。

角色对象的安全性

Moralis.Role​使用与Moralis上的所有其他对象相同的安全方案(ACL),但它需要显式设置ACL。通常,只有具有极大提升权限的用户(例如主用户或管理员)才能创建或修改角色,因此您应该相应地定义其ACL。请记住,如果您为某个用户授予​Moralis.Role​写入权限,则该用户可以将其他用户添加到该角色,甚至完全删除该角色。

要创建一个新的​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​关系添加应该继承新角色权限的用户和角色:

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

将ACL分配给您的角色时要格外小心,以便它们只能由应该有权修改它们的人进行修改。

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

现在您已经创建了一组在应用程序中使用的角色,您可以将它们与ACL一起使用来定义其用户将获得的权限。每个​Moralis.Object​都可以指定一个​Moralis.ACL​,它提供了一个访问控制列表,指示哪些用户和角色应该被授予对该对象的读取或写入访问权限。

授予角色对对象的读取或写入权限非常简单。您可以使用​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();

角色层次

如上所述,一个角色可以包含另一个角色,从而在两个角色之间建立父子关系。这种关系的结果是授予父角色的任何权限都隐式授予其所有子角色。

这些类型的关系通常出现在具有用户管理内容的应用程序中,例如论坛。一小部分用户是管理员,对调整应用程序的设置、创建新论坛、设置全局消息等具有最高级别的访问权限。另一组用户是版主,他们负责确保用户创建的内容保持适当。任何具有管理员权限的用户也应该被授予任何主持人的权限。要建立这种关系,您可以让您的管理员角色成为版主的子角色,如下所示:

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