[英]Meteor Roles package - userIsInRole always returns false
我希望在路由级别上有一个过滤器,检查用户是否处于特定角色。
this.route('gamePage', {
path: '/game/:slug/',
onBeforeAction: teamFilter,
waitOn: function() { return […]; },
data: function() { return Games.findOne({slug: this.params.slug}); }
});
这是我的过滤器:
var teamFilter = function(pause) {
if (Meteor.user()) {
Meteor.call('checkPermission', this.params.slug, Meteor.userId(), function(error, result) {
if (error) {
throwError(error.reason, error.details);
return null;
}
console.log(result); // returns always false
if (!result) {
this.render('noAccess');
pause();
}
});
}
}
在我的收藏中:
checkPermission: function(gameSlug, userId) {
if (serverVar) { // only executed on the server
var game = Games.findOne({slug: gameSlug});
if (game) {
if (!Roles.userIsInRole(userId, game._id, ['administrator', 'team'])) {
return false;
} else {
return true;
}
}
}
}
我的第一个问题是Roles.userIsInRole(userId, game._id, ['administrator', 'team']
始终返回false。起初,我在router.js
有此代码,但后来我认为它不起作用由于缺少发布/订阅,因此我确保代码仅在服务器上运行。我检查了数据库,并确定用户是该角色。
我的第二个问题是,我现在收到一个异常( Exception in delivering result of invoking 'checkPermission': http://localhost:3000/lib/router.js?77b3b67967715e480a1ce463f3447ec61898e7d5:14:28
): this.render('noAccess');
我不知道为什么。
我已经读过这篇文章: 流星Roles.userIsInRole()总是返回false,但是并不能解决我的问题。
任何帮助将不胜感激。
在teamFilter
挂钩中,您调用Meteor.method checkPermission
,它异步工作,并且OnBeforeAction期望同步执行(没有回调)。 这就是为什么您总是收到错误的原因。
另一件事是您错误地使用了Roles.userIsInRole
:
应该:
Roles.userIsInRole(this.userId, ['view-secrets','admin'], group)
在这种情况下,我将在客户端检查角色:
Roles.userIsInRole(userId, ['administrator', 'team'])
您可能担心此解决方案的安全性。 我不认为你应该。 最重要的是数据,并且数据受发布功能保护,该功能应检查角色。
请注意,客户端可以访问所有模板。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.