繁体   English   中英

流星角色包-userIsInRole始终返回false

[英]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'])

您可能担心此解决方案的安全性。 我不认为你应该。 最重要的是数据,并且数据受发布功能保护,该功能应检查角色。

请注意,客户端可以访问所有模板。

您只能为服务器上的用户添加角色,因为您可以使用Meteor.call({});。 客户端main上检查此处的方法到服务器main.js上的调用方法,您可以在此方法调用之后检查是否使用流星mongo和db.users.find({})。pretty()将角色添加到用户集合中,并查看是否如果将角色数组添加到该usedId的用户,则可以在客户端上的任何位置使用Roles.userIsInRole()函数来检查已登录的用户角色。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM