使用流星角色和铁流星限制视图仅在某些条件下有效

时间:2015-11-03 06:57:19

标签: javascript meteor iron-router roles

所有这些都来自routes.js档案......

首先,只有三个路由进行new操作,然后是两个视图,根据角色不同地列出这些项目;一个用于director,一个用于actor

/////////////////////////////////////////////////////////
// Routes

Router.route('/:_id/new_audition', {
  name: 'newAudition',
  controller: 'NewAuditionController',
  action: 'new',
  where: 'client'
});

Router.route('/:_id/feed', {
  name: ':UserFeed',
  controller: 'FeedController',
  action: 'view',
  where: 'client'
});

Router.route('/:_id/list_auditions', {
  name: 'listAuditions',
  controller: 'ListAuditionsController',
  action: 'view',
  where: 'client'
});

然后,我只是定义onBeforeAction行为,以便actors用户可以查看list_auditions视图,导演可以访问其他两个。

/////////////////////////////////////////////////////////
// Functions for use with Router Hooks

var forDirectorsOnly = function() {
  if (!Roles.userIsInRole(Meteor.user(), 'director')) {
    toastr.error("Only directors can view that page", "Invalid Permissions");
    Router.go("myProfile");
  }
  else {
    console.log("Director trying to view a page");
    this.next();
  }
};

var forActorsOnly = function() {
  if(!Roles.userIsInRole(Meteor.user(), 'actor')) {
    toastr.error("Only actors can view that page", "Invalid Permissions");
    Router.go("myProfile");
  }
  else {
    console.log("Actor trying to view a page");
    this.next();
  }
};

/////////////////////////////////////////////////////////
// onBeforeAction Declarations

Router.onBeforeAction(forDirectorsOnly, {only: ['UserFeed', 'newAudition']});
Router.onBeforeAction(forActorsOnly, {only: ['listAuditions']});

这就是发生的事情:

  • 我将作为导演登录并转到UserFeed路线,它显示得很好。 (但console.log消息不会显示。)
  • 然后我转到newAudition路由,它会重定向并显示权限错误。
  • 奇怪的是,当我在浏览器中按Back时,它会正确显示newAudition视图(并且还会显示console.log消息。)
  • 最后,转到listAuditions视图会正确拒绝我的权限,甚至尝试通过浏览器转到Back继续拒绝我访问。

我的智慧结束了这一点,我已经看过每一个可能的问题,并尝试阅读铁路由器文档和流星角色文档,看看发生了什么,但我可以'弄清楚这一点。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

而不是Router.go(routeName)挂钩中的onBeforeAction使用this.render(routeName)。我不确定为什么会出现这种情况,但在Router.go()中使用onBeforeAction会导致您所描述的行为类型。

答案 1 :(得分:0)

而不是限制对路径的访问和重定向,你可以尝试类似下面的模板:

<template name="newAudition">
    {{#isInRole "director"}}
        You cannot view this page. Go to Profile.
    {{/if}}
    {{#isInRole "actor"}}
        How the New Audition Content
    {{/if}}
</template>

此外,根据用户角色显示/隐藏导航链接。