检查用户是不是有角色 - 解析云代码

Posted

技术标签:

【中文标题】检查用户是不是有角色 - 解析云代码【英文标题】:Check if User has Role - Parse Cloud Code检查用户是否有角色 - 解析云代码 【发布时间】:2015-05-24 12:35:58 【问题描述】:

编写Parse Cloud Function(使用Parse javascript SDK),我无法检查当前用户是否具有“管理员”角色。我正在查看 Role 类的 Web 视图,并且存在一个名为“Admin”的角色,如果我为用户单击“View Relations”,它会显示当前用户。我怀疑它应该重要,但“管理员”是唯一的角色,当前用户是唯一具有角色的用户。最后,“Admin”角色有一个公共读取的 ACL,所以这也不应该引起任何问题。

代码如下:

...
var queryRole = new Parse.Query(Parse.Role);
queryRole.equalTo('name', 'Admin'); 
queryRole.equalTo("users", Parse.User.current());
queryRole.first(
    success: function(result)  // Role Object
        var role = result;
        role ? authorized = true : console.log('Shiet, user not Admin');
    ,
    error: function(error) 
        console.log("Bruh, queryRole error");
    
)
console.log('After test: Auth = ' + authorized);
if (!authorized) 
    response.error("You ain't no admin, measly user");
    return;    

...

这会在日志中产生以下内容:

测试前:Auth = false

测试后:Auth = false

【问题讨论】:

你需要使用承诺。您正在查询完成之前读取该值。 是的,我意识到,从 Bryan 下面的有效代码中,我建议进行编辑,其中包含的不仅仅是“试一试”,但它被“拒绝”了。 【参考方案1】:

对于那些正在寻找 Parse Server (2018) 答案的人,请参见下文:

Parse.Cloud.define('authorizedUserTest', function(request, response) 


  if(!request.params.username)
    //response.error('no username');
      response.error(request.params);
  

  var queryRole = new Parse.Query(Parse.Role);
  queryRole.equalTo('name','Admin');

  queryRole.first( useMasterKey: true ).then(function(promise)
    var role = promise;
    var relation = new Parse.Relation(role, 'users');
    var admins = relation.query();
    admins.equalTo('username', request.user.get('username'));
    admins.first( useMasterKey: true ).then(function(user)
      if(user)
        response.success(true)
      
      else 
        response.success(false)
      
    , function(err)
      response.error('User is not an admin')
    )
  , function(err)
    response.error(err)
  )



);

request.params 等于字典 "username":inputUsernameHere。

如果您有任何问题,请随时发表评论。

【讨论】:

如何保证主密钥的安全? 主密钥仅在 node.js 应用程序中...不在客户端代码中。所以据我所知它是安全的,但在将此作为答案之前应该咨询其他人【参考方案2】:

我有一个更简单的解决方案,试试这个:

var adminRoleQuery = new Parse.Query(Parse.Role);
adminRoleQuery.equalTo('name', 'admin');
adminRoleQuery.equalTo('users', req.user);

return adminRoleQuery.first().then(function(adminRole) 
  if (!adminRole) 
    throw new Error('Not an admin');
  
);

【讨论】:

我可以验证此语法是否有效:equalTo('relation', value)notEqualTo('relation', value) 确实通过相等性匹配元素。这应该是正确的答案。 如果您为用户设置了具有读取权限的角色的 ACL,那么如果用户有权这样做,或者从对该角色具有读取权限的另一个角色,查询应该获取该角色,对吗? 我无法确认,因为我没有测试过。但是,是的,它应该这样工作!【参考方案3】:

试一试:

var authorized = false;
console.log('Before test: Auth = ' + authorized);

var queryRole = new Parse.Query(Parse.Role);
queryRole.equalTo('name', 'Admin');
queryRole.first(
    success: function(result)  // Role Object
        console.log("Okay, that's a start... in success 1 with results: " + result);

        var role = result;
        var adminRelation = new Parse.Relation(role, 'users');
        var queryAdmins = adminRelation.query();

        queryAdmins.equalTo('objectId', Parse.User.current().id);
        queryAdmins.first(
            success: function(result)     // User Object
                var user = result;
                user ? authorized = true : console.log('Shiet, user not Admin');
            
        );
    ,
    error: function(error) 
        console.log("Bruh, can't find the Admin role");
    
).then(function() 
    console.log('After test: Auth = ' + authorized);
);

【讨论】:

.. 我真的很喜欢“Shiet,用户不是管理员”:) 当然,对我帮助很大! 如果有人在 2018 年看到这个......你需要这样做......使用MasterKey。我将在下面发布答案。

以上是关于检查用户是不是有角色 - 解析云代码的主要内容,如果未能解决你的问题,请参考以下文章

检查用户是不是有角色 Discord.net

解析服务器云代码 - 检查用户名

Discord.py - 检查用户是不是具有执行命令的特定角色

如何检查未登录用户是不是有角色?

如何检查用户是不是有任何角色 discord.js

DNN 检查用户是不是在角色组中