Meteor Roles包 - userIsInRole始终返回false

时间:2014-09-10 12:35:35

标签: javascript mongodb meteor

我希望在路由级别上有一个过滤器,检查用户是否处于特定角色。

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但它并没有解决我的问题。

非常感谢任何帮助。

2 个答案:

答案 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()函数来检查登录用户角色。