开源Parse Server

07.角色Roles

2017-09-23  本文已影响0人  xiangdong_9013

角色

随着应用程序的应用范围和用户群体的增长,您可能会发现自己需要比用户链接式ACL能提供的访问数据分片更粗粒度的控制。为了解决这个问题,Parse支持一种基于角色的访问控制。角色提供了一种逻辑的方式,将用户按照对Parse数据具有共同访问权限进行分组。角色是包含用户和其他角色的命名对象。授予角色的任何权限都会隐式授予其用户以及其包含的任何角色的用户。

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

我们提供一个称为Parse.Role的专门的类,在客户端代码中体现这些角色对象。Parse.Role是Parse.Object的一个子类,具有所有Parse.Object相同的特性,如灵活的Schema模式、自动持久化和键值接口。Parse.Object所有的方法也存在于Parse.Role。不同之处在于,Parse.Role具有一些用于角色管理的额外特性。

1.Parse.Role 属性

Parse.Role有几个有别于Parse.Object的属性:

2.Role对象的安全性

Parse.Role使用与Parse中所有其他对象相同的安全模型(访问控制列表),不同的是它需要显式设置ACL。通常,只有具有极高等级权限的用户(例如主用户或管理员)才能创建或修改角色,因此您需要相应地定义其ACL。请记住,如果您向用户授予写入Parse.Role的权限,那么该用户可以将其他用户添加到角色中,甚至完全删除角色。

要创建一个新的Parse.Role,可以这样写:

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

您可以添加用户和角色,他们通过Parse.Role上的“用户”和“角色”关系继承新角色的权限:

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

为角色分配ACL时,请务必小心,以便只使得具有修改权限的用户能够修改角色。

3.其他对象的基于角色的安全

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

给一个角色赋予读取或写入对象的权限很简单。你可以使用Parse.Role:

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

您可以通过指定ACL的名称来避免查询角色:

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

4.角色的继承层级

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

这些类型的关系通常在具有用户管理内容(如论坛)的应用程序中找到。一小部分用户是“管理员”,拥有调整应用程序的设置、创建新的论坛、设置全局消息等操作的最高权限。另一组用户是“版主”,以负责确保用户创建的内容仍然恰如其分的使用。任何具有管理员权限的用户也应授予版主的权限。要建立这种关系,您可使“管理员”角色作为“版主”的子角色,如下所示:

var administrators = /* Your "Administrators" role */;
var moderators = /* Your "Moderators" role */;
moderators.getRoles().add(administrators);
moderators.save();
上一篇下一篇

猜你喜欢

热点阅读