解析-这是如何使用ACL和CLP保护用户和其他对象的正确方法吗?



解析新,请求社区反馈我是否正确设置了解析ACL和CLP安全性....

Parse Security似乎就是在其他安全层之上构建安全层。

我担心有人可以使用clientkey访问各种对象和他们的数据,除非我用ACL和CLP的....正确地锁定它

下面,我简要地概述了三个对象(_User, _Role和my FileUpload),相关的代码和关系。

我正在构建测试安全性的网站将使用户能够创建一个用户(在_User中)并将他们的文件上传到FileUpload对象。

<

_User对象/strong>

从登录页面,我只想允许用户创建,用户表设置如下:-

  1. "public access" CLP设置只有"Create"权限,其他的都是禁用的。
  2. CloudCode afterSave在用户创建时设置新用户的ACL(代码如下)。
  3. CloudCode afterSave在用户创建时分配名为"signed"的角色给新用户。(代码如下,角色"签名"细节如下)

在CloudCode on User afterSave中,上述项目2和3的代码如下:-

Parse.Cloud.afterSave(Parse.User, function(request) {
    if (!request.object.existed()) {
        Parse.Cloud.useMasterKey();     
        var user = request.object;
        if (user.existed()) { return; }
        //2. set ACL on user
        var acl = new Parse.ACL(user);
        acl.setPublicReadAccess(false);
        user.setACL(acl);
        user.save();
        //3. assign role "signed" to user
        var roleQuery = new Parse.Query(Parse.Role);
        roleQuery.equalTo("name", "signed");
        roleQuery.first().then(function(role) {     
            role.getUsers().add(user);
            return role.save();
        });  
    }
});
<

_Role对象/strong>

我在_Role中创建了一个名为signed的角色

  1. "signed"角色ACL设置为"Master Key Only"
  2. "public access" read &
  3. 在_Role中没有启用CLP(参见第2点),因此,不允许CRUD,但我不确定Parse如何允许"签名"角色工作。
<

FileUpload对象/strong>

设置该对象,以便用户只有在登录时才能将文件上传到FileObjects。

  1. 在FileUpload Object中存在一个指向User Object的指针。
  2. "public access" read &
  3. 为FileUpload对象写CLP被禁用。
  4. 为FileUpload对象添加了"signed" CLP。
  5. FileUpload Object中角色"signed"的CLP权限仅设置为"查找","创建","更新",这允许ACL设置为用户objectId

为了确保用户不能看到其他用户的文件加载,我在保存后对"FileUpload"设置了以下ACL。

 Parse.Cloud.afterSave("FileUpload", function(request, response) {
   var currentUser = Parse.User.current(); 
   if(!currentUser) {
        console.log('This is a user that is not logged in trying to upoad a file');
    } else if (currentUser) {
        var acl = new Parse.ACL(currentUser);
        acl.setPublicReadAccess(false);
        var user = request.object;
        user.setACL(acl);
        user.save();
        response.success();   
    } else {
         console.log('Cannot upload file');
    } 
});

这可能有点晚了,但我还是会给你我的反馈,因为还没有人回答。

首先,对于_User类,不需要设置这些acl,因为有Parse。用户默认具有公共读取和读写权限。因为您有一个仅创建的CLP,所以不需要显式地将公共访问设置为false,除非您计划在将来更改CLP。

第二,用于Parse。用户保存后,我建议只在需要时使用主密钥。因此,您可以在开头删除useMasterKey调用,只使用roleQuery.first调用它。

FileUpload afterSave有一个bug,我相信:你想设置请求。对象的ACL,而不是用户的ACL。

最新更新