2

私が達成したい機能はこれです

  1. ユーザーが登録すると、2 つのロール (管理者、ユーザー) が作成されます
  2. ユーザーが管理者である場合、他のユーザーを招待して同じアカウントに参加するようにユーザー権限 (非管理者) で許可する必要があります。
  3. 管理者ではないユーザーは、参加するように人々を招待することはできません

これは、クラウドコードでこれを達成しようとしている方法です

  1. アカウントの作成時に 2 つのロールを作成する
  2. 管理者とユーザーの ACL を持つ 2 つのダミー オブジェクトを作成します。以下は、これら 2 つの手順のコードです。

    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);
        }
    });
});

サインアップしようとすると、現在のユーザーが作成された管理者ダミー オブジェクトを見つけることができるかどうかを確認したいだけです (そのための ACL は管理者ロールのみがアクセスするように設定されているため)。オブジェクトを読み取ることができる場合、現在のユーザーが管理者ロールに属していることを意味するはずですか? ここにコードがあります

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);
        }
    })

});

問題は、管理者ユーザーがログインしているにもかかわらず、作成されたダミー オブジェクトが上記のメソッドのクエリで返されないことです。不足しているものはありますか? この機能を実現するためのより良い方法はありますか?

データ ブラウザーを確認したところ、2 つのロールが作成されていることがわかります。ユーザーは両方のグループのメンバーです。また、これら 2 つの ACL でそれぞれ 2 つのダミー オブジェクトが作成されていることもわかります。

  1. {"role:XYZ_Administrator":{"read":true}}
  2. {"role:XYZ_user":{"read":true}}
4

0 に答える 0