在Iron Router中的URL的特定部分中运行代码

时间:2015-04-16 21:00:27

标签: meteor iron-router

我有一个应用程序,它大量使用由特定用户分隔的功能,这些功能具有不同的角色。

问题是我想限制对某些模板的访问,例如,如果用户不是管理员。

目前,我有这个:

Router.route('createUser', {
  path: '/admin/users/',
  onBeforeAction: function() {
    if(!isAdmin()) {
        Router.go('/');
    }
    this.next();
  }
});

但是,指定if(isAdmin())调用其他所有路径是一件痛苦的事。我想知道是否还有其他容易且不易出错的方法。

也许有一些正则表达式魔术会做,但我似乎没有找到任何使用的例子。

2 个答案:

答案 0 :(得分:3)

首先,我建议您在个人资料编辑部分

上阅读此meteor:common-mistakes

因此,我建议您更好地使用alanningroles-meteor package

非常容易使用,如果您有疑问,可以使用Online DEMOSource Code

在路由器级别,您可以创建这样的onBefore挂钩。

isAdmin = function(){
  var currentUser = Meteor.user()
         isUserSuperAdmin = Roles.userIsInRole(currentUser,'Super-Admin'); //using alaning roles.

           if(isUserSuperAdmin){ //or use isAdmin(); 
             this.next();
           }else{
             this.render('accessDenied')
           }
}

Router.onBeforeAction('accessDenied', {only: ['admin','otherAdminRoute',etc]});

答案 1 :(得分:1)

对于所有路线,您可以将onBeforeAction挂钩与only结合使用:

var isAdmin = function() {
    // Whatever logic you have for checking admin
    if (!admin) {
        Router.go("/");
    }
    this.next();
}

Router.onBeforeAction(isAdmin, {
  only: ["admin/users"] // Specify other admin templates here
});