登录不同角色后管理路线的正确方法

Correct way to manage routes after sign in for different roles

我有 2 个角色,管理员和用户。我有一条主页路线 '/',它只是一个登录页面。当管理员用户登录时,他们必须转到一条路线 ('adminPortal'),而当用户用户登录时,他们必须转到 'userPortal' 路线。注销后,两个角色都应路由回 '/'.

在我担任管理员角色之前,我是这样登录的:

Router.onBeforeAction(function() {
  this.render('loading');
  if (! Meteor.userId()) {
    this.render('Home');
  } else {
    this.next();
  }
});

效果很好(实际上它破坏了我刚刚发现的 waitOn: 渲染加载模板内容,但稍后会详细介绍)。然后我添加了这样的角色(来自我现在找不到的 Stack Overflow 答案):

服务器/

insertUsers=function(){
  var adminId=Accounts.createUser({
    username:"admin",
    password:"password"
  });

  Roles.addUsersToRoles(adminId,"admin");

  var userIdd = Accounts.createUser({
    username:"user",
    password:"password"
  });

  Roles.addUsersToRoles(userIdd,"user");

};

Meteor.startup(function () {
  // always start from scratch (you will want to comment this line at some point !)
  Meteor.users.remove({});
  if(Meteor.users.find().count()===0){
    insertUsers();
  }
})

Meteor.publish("user", function () {
  if (this.userId) {
    return Meteor.users.find({_id: this.userId},
                             {fields: {'roles': 1}});
  } else {
    this.ready();
  }
});

我尝试像这样路由到 user/admin 门户:

router.js

Router.route('/', {

  before: function() {
    if (! Meteor.userId()) {  // I acutally added this check that the user is not logged in after the infinite loading problem but I thought the question was getting too long so I just left it in rather
      this.render('Home')
    } else {
      if (Roles.userIsInRole(Meteor.user(), 'admin')) {
        Router.go('/admin')
      } else {
        Router.go('/user')
      }
    }
  },

  waitOn: function () {
    return Meteor.subscribe('user');
  }

});

现在这几乎可以工作了!如果我以任一用户身份登录,我会转到正确的门户。但是,当我注销时,我的 onBeforeAction(即这个问题中的第一个代码块)只呈现 Home 模板,实际上并没有将 URL 更改为 '/'(即URL 仍然是 '/user''/admin')。现在,当我第二次尝试登录时,它将始终带我到第一次登录时的路线,除非我手动将浏览器 URL 更改为 '/'。所以我想我只是用 Router.go('/'); 替换 this.render('Home') 但这似乎已经创建了某种无限循环,其中 Home 模板永远不会呈现(它现在偶然做了第一个虽然时间正确地呈现了我的加载模板)。

感谢您阅读所有内容!正确的做法是什么?

尝试在注销按钮事件中添加 Router.go('/'); 以及 Meteor.logout();

示例:

Template.loginButtons.events({
    'click #login-buttons-logout' : function (event, template) {
        Meteor.logout(function(err) {
            Router.go('/');
        });
    }
});

我遇到了和你一样的问题,这是我发现注销后 return 回到主页的最简单方法。