我希望在路由级别上有一个过滤器,检查用户是否处于特定角色。
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');
并且我不知道原因。
我已经读过这个:meteor Roles.userIsInRole() always returning false但它并没有解决我的问题。
非常感谢任何帮助。
答案 0 :(得分:1)
在teamFilter
挂钩中,您调用Meteor.method checkPermission
,其工作异步,OnBeforeAction需要同步执行(无回调)。这就是为什么你总是收到假的。
另一件事是您错误地使用Roles.userIsInRole
:
应该是:
Roles.userIsInRole(this.userId, ['view-secrets','admin'], group)
在这种情况下,我会检查客户端的角色:
Roles.userIsInRole(userId, ['administrator', 'team'])
可能你担心这个解决方案的安全性。 我不认为你应该这样做。 最重要的是数据和数据受发布功能保护,应该检查角色。
请注意,客户可以访问所有模板。
答案 1 :(得分:0)
您可以仅在服务器上向用户添加角色,您可以使用Meteor.call({});从客户端到服务器的main.js上调用方法的check here方法,如果使用meteor mongo和db.users.find({})在这个用户集合中添加了角色,则可以在此方法调用之后进行检查。漂亮()和看看角色数组是否添加了usedId的用户,那么您可以在客户端的任何位置使用Roles.userIsInRole()函数来检查登录用户角色。