2016-08-04 34 views
0

我试图为我的应用设置“general_user”角色,以便管理员可以通过从用户角色中删除用户来禁止用户。parse-server在afterSave中为用户和角色设置ACL

此代码:

Parse.Cloud.afterSave(Parse.User, function(request, response) { 
var user = request.object; 
if (user.existed()) { return; } 

var roleQuery = new Parse.Query(CONSTANTS.ROLE_CLASSNAME); 
roleQuery.equalTo("name", CONSTANTS.GENERAL_USER_ROLENAME); 
roleQuery.first(CONSTANTS.USE_MASTER_KEY) 
    .then(function(generalUserRole) { 
     if(generalUserRole) 
     { 
      generalUserRole.getUsers().add(user); 
      return generalUserRole.save(); 
     } 
     else 
     { 
      var role = new Parse.Role(CONSTANTS.GENERAL_USER_ROLENAME, new Parse.ACL()); 
      role.getUsers().add(user); 
      return role.save(); 
     } 
    }).then(function(generalUserRole) { 
     var acl = new Parse.ACL(); 
     acl.setWriteAccess(user, true); 
     acl.setRoleReadAccess(generalUserRole, true); 
     req.object.setACL(acl); 
    }, 
    function(error) { 
     console.log(JSON.stringify(error)); 
    }); 
}); 

结果在ACL这是public read, user(write)(在仪表盘读数)。

我试过在添加ACL后保存保存req.object。

我试过了,没有res.success()(我知道在afterSaves中没有必要)。

谢谢。

回答

1

我测试了你的代码,发现了一些问题并修复了它们。我发现的问题有:

  1. ,这样你就不需要写response.success()
  2. ,你做得很好,当你设置的ACL的响应不afterSave只请求所需用户但你没有保存它..如果你不会在年底运行节省所以你需要与useMasterKey运行保存它不会保存的更改:为了保存更改,真

在结束你的代码看起来应该像下面这样:

Parse.Cloud.afterSave(Parse.User, function (req) { 

    var user = req.object; 
    if (user.existed()) { return; } 

    var roleQuery = new Parse.Query(Parse.Role); 
    roleQuery.equalTo("name", "someRole"); 

    roleQuery.first({ useMasterKey: true }).then(function (role) { 

     if (role) { 
      role.getUsers().add(user); 
      return role.save(); 
     } else { 
      var myNewRole = new Parse.Role("someRole", new Parse.ACL()); 
      myNewRole.getUsers().add(user); 
      return myNewRole.save() 
     } 

    }).then(function (userRole) { 
     var acl = new Parse.ACL(); 
     acl.setWriteAccess(user, true); 
     acl.setRoleReadAccess(userRole, true); 
     user.setACL(acl); 
     return user.save(null,{ useMasterKey: true }); 
    }, function (error) { 
     console.log(JSON.stringify(error)); 
    }); 

}); 
+0

所以我曾试图像这样,它不工作,当你说,它的工作,我意识到这一定是别的东西。所以我删除了我的Parse.User表中的所有用户(使用旧的ACL),然后一切正常。谢谢。 – MayNotBe

+0

很酷。很高兴现在它适合你 –