在云引擎中使用 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}}