Parse platform 云代码:用户可以';t访问对象,该对象具有其所属角色的ACL

Parse platform 云代码:用户可以';t访问对象,该对象具有其所属角色的ACL,parse-platform,role,rbac,Parse Platform,Role,Rbac,我想要实现的功能是 当用户注册时,将创建两个角色(管理员、用户) 如果用户是管理员,他应该能够邀请其他用户加入具有用户权限(非管理员)的同一帐户 非管理员的用户不能邀请其他人加入 这就是我试图在云代码中实现这一点的方式 创建帐户时创建两个角色 使用管理员和用户ACL创建两个虚拟对象,下面是这两个步骤的代码 Parse.Cloud.afterSave("account", function(request) { var accountName = request.object.get("n

我想要实现的功能是

  • 当用户注册时,将创建两个角色(管理员、用户)
  • 如果用户是管理员,他应该能够邀请其他用户加入具有用户权限(非管理员)的同一帐户
  • 非管理员的用户不能邀请其他人加入
  • 这就是我试图在云代码中实现这一点的方式

  • 创建帐户时创建两个角色
  • 使用管理员和用户ACL创建两个虚拟对象,下面是这两个步骤的代码

    Parse.Cloud.afterSave("account", function(request) {
        var accountName = request.object.get("name");
        //create admin role
        var adminRoleACL = new Parse.ACL();
        adminRoleACL.setPublicReadAccess(false);
        adminRoleACL.setPublicWriteAccess(false);
        var adminRole = new Parse.Role(accountName + ADMINISTRATOR, adminRoleACL);
        adminRole.save();
    
        //create user role
        var userRoleACL = new Parse.ACL();
        userRoleACL.setPublicReadAccess(false);
        userRoleACL.setPublicWriteAccess(false);
        var userRole = new Parse.Role(accountName + USER, userRoleACL);
        userRole.save();
    
        // create dummy object for each role with access to only that role
        // we will use these dummy objects in cloud code to figure out whether
        // the user belongs to that group.
    
        //create dummy for admin
        var dummy = new Dummy();
        dummy.set("name", accountName + ADMINISTRATOR + DUMMY);
        var dummyACL = new Parse.ACL();
        dummyACL.setPublicReadAccess(false);
        dummyACL.setRoleReadAccess(adminRole, true);
        dummy.setACL(dummyACL);
        dummy.save();
    
        //create dummy for user
        dummy = new Dummy();
        dummy.set("name", accountName + USER + DUMMY);
        dummyACL = new Parse.ACL();
        dummyACL.setPublicReadAccess(false);
        dummyACL.setRoleReadAccess(userRole, true);
        dummy.setACL(dummyACL);
        dummy.save();
    
    });
    
  • 创建帐户后,我将此用户添加到管理员和用户组,下面是代码

    Parse.Cloud.define("addUsersToRole", function(request, response) {
        Parse.Cloud.useMasterKey();
        var currentUser = request.user;
        var accountName = request.params.accountname;
    
        var query = new Parse.Query(Parse.Role);
        query.contains("name", accountName);
        query.find({
            success : function(roles) {
                console.log("roles: " + roles.length);
                for (var i = 0; i < roles.length; i++) {
                    roles[i].getUsers().add(currentUser);
                    roles[i].save();
                }
                response.success();
            },
            error : function(error) {
                response.error("error adding to admin role " + error);
            }
        });
    });
    
    Parse.Cloud.define("inviteToSignUp", function(request, response) {
        var userEmail = request.params.email;
        var currentUser = request.user;
        var accountName = currentUser.get("accountname");
    
        //do it only if the user is admin
        var query = new Parse.Query(Dummy);
        query.equalTo("name", + accountName + ADMINISTRATOR + DUMMY);
    
        query.first({
            success : function(dummy) {
                if(dummy) {
                    sendSignupEmail(userEmail, currentUser, request, response);
                } else {
                    response.error("Invitation failed. You don't have the priviledges to add new user. Please contact your administrator'");
                }
            }, 
            error : function(error) {
                response.error("error while inviting users. " + error.message);
            }
        })
    
    });
    
    现在的问题是,即使管理员用户登录到创建的虚拟对象中,也不会在上述方法的查询中返回。 我有什么遗漏吗?是否有更好的方法实现此功能

    我检查了数据浏览器,可以看到正在创建的两个角色,用户是这两个组的成员。我还看到创建了两个虚拟对象,每个对象都使用这两个ACL

  • {“角色:XYZ_管理员”:{“读取”:true}
  • {“role:XYZ_user”:{“read”:true}

  • 我也正经历着这个问题。您找到有效的解决方案了吗?在数据浏览器中将类权限设置为“Public”后,我的问题自行解决。该设置似乎覆盖了我在对象级别设置的任何ACL,因此导致我在对象上的更新失败。现在,它尊重对象级ACL并正常工作。