在云引擎中使用 ACL
云引擎 提供给开发者自定义云端逻辑的接口,例如开发者想记录每一个用户登录系统的时间,打印一下日志,以备之后的查询和分析,那么云引擎提供的接口就可以实现这一需求,详细的操作请查看 云函数和 Hook 文档。
需求
提到以上这个需求是为了让开发者更好地理解以下的需求描述:
假如开发者的应用有 iOS、Android、Web(JavaScript)各种版本,针对权限管理的逻辑代码会遍布各个客户端,开发者会重复书写逻辑极其类似的代码,只不过是不同语言的版本而已。因此,假如有一个云端的接口,让开发者可以在创建对象或者更新对象的时候,为其添加 ACL 相关的代码,那么各个客户端就无需再重复编码。
示例
我们从一个简单的实例入手:
我们希望每发一篇帖子,不管是从 iOS 还是 Android,还是任意客户端发出的,都希望管理员具备对它读写的权限。
第一步,我们需要编写我们的云引擎 Hook 函数(关于云引擎 Hook 函数介绍请查看 Save 前执行操作):
- Node.js
- Python
- PHP
- Java
AV.Cloud.beforeSave('Post', (request) => {
const post = request.object;
if (post) {
var acl = new AV.ACL();
acl.setPublicReadAccess(true);
// 假定已经存在一个 `admin` 角色
acl.setRoleWriteAccess('admin', true);
post.setACL(acl);
} else {
throw new AV.Cloud.Error('Invalid Post object.');
}
});
@engine.before_save('Post')
def before_post_save(post):
acl = leancloud.ACL()
acl.set_public_read_access(True)
# 假定已经存在一个 `admin` 角色
admin = leancloud.Role('admin')
acl.set_role_write_access(admin, True)
post.set_acl(acl)
Cloud::beforeSave("Post", function($post, $user) {
$acl = new ACL();
$acl->setPublicReadAccess(true);
// 假定已经存在一个 `admin` 角色
$acl->setRoleWriteAccess("admin", true);
$post->setACL($acl);
});
@EngineHook(className = "Post", type = EngineHookType.beforeSave)
public static AVObject postBeforeSaveHook(AVObject post) throws Exception {
AVACL acl = new AVACL();
acl.setPublicReadAccess(true);
// 假定已经存在一个 `admin` 角色
acl.setRoleWriteAccess("admin", true);
post.setACL(acl);
return post;
}
部署代码到云端后,每个在客户端创建的帖子,保存后会自动添加如下的 ACL:
{"*":{"read":true},"role:admin":{"write":true}}