在Meteor.js中为不同用户提供不同版本的网站

时间:2014-11-14 23:30:28

标签: javascript node.js meteor meteorite ab-testing

在Meteor.js中,一般如何为不同的用户提供(例如,取决于role集合中的字段users,其中admin可以包含users,{{1} },testers)网站的不同版本(客户端和服务器端)?

1 个答案:

答案 0 :(得分:1)

首先,我使用Iron Router进行路由。在某些时候,我可能会删除它并编写我自己的,至少对于这个项目,因为我没有使用一半的功能,但是现在这就是我所拥有的。

对于角色,我使用alanning:roles包。再一次,我可以写自己的,但它现在也做我需要它,所以我很高兴。

接下来我有一个我写的自定义包。在其中我设置了一个用于登录和注销的模板,包括路由等。我还提供了一个实用程序类,它提供了一个名为authenticationRequired的函数。此函数将检查当前用户是否已登录,以及是否传递了角色,因为他们具有这些角色。代码如下所示:

AccountUtils.authenticationRequired = function(router, roles) {
    if (!router) {
        throw new Meteor.Error(500, 'Router is a required parameter');
    }

    if (!Meteor.loggingIn()) {
        var currUser = Meteor.user();
        if (currUser) {
            if (roles) {
                if (!Roles.userIsInRole(currUser, roles)) {
                    console.log('User was not in the required roles: %j, %j', currUser.roles, roles);
                    //throw new Meteor.Error(403, 'Access Denied');
                    Router.go('notAuthorized');
                }
            }
        } else {
            console.log('User not found');
            Router.go(AccountUtils.settings.signinRoute);
        }
    }
}

现在,在我的Router路由器中,我做了类似的事情:

this.route('admin', {
    path: '/admin',
    onBeforeAction: function() { AccountUtils.authenticationRequired(this, ['ADMIN']); }
});

所有这些都有一些活动部分,但这就是它的开玩笑。在路径的onBeforeAction中,检查用户是否具有所需角色。如果没有,请将它们发送到notAuthorize页面。如果他们是,让他们通过。我仍然遗漏了一些我在这段代码中尚未解决的问题,但它在很大程度上都有效。

希望能为您提供一个起点。