检查用户是不是有角色 - 解析云代码
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。我将在下面发布答案。以上是关于检查用户是不是有角色 - 解析云代码的主要内容,如果未能解决你的问题,请参考以下文章