从简历中处理铁路由器中用户验证的最佳方法

时间:2014-02-21 17:31:43

标签: meteor iron-router

我的基本设置是我有一个登录页面,代表页面和经理页面。

我已经在铁路由器中设置了我的路由并在挂钩之前加入一些来验证是否有用户具有适当的角色。对于登录页面,我想看看是否有用户,什么类型的用户(使用角色),然后如果他们已经登录则发送到他们正确的页面。对于用户类型页面我想检查是否有用户,确保他们在正确的位置,如果没有,请将他们发回登录页面或正确的页面。

每个用户在profile.organization中都有一个角色('rep',organizationId)和一个组织。我检查他们在组织中扮演的角色。

除非有人恢复会话,否则这一切都很有效。如果他们从注销开始,它就会游泳,但如果他们昨天登录并重新打开网站,那么它就位于登录页面。我认为这是因为他们正在重新登录。

所以,问题是,处理检查用户是否已登录或登录的最佳方法是什么。棘手的部分是我需要从用户配置文件中获取数据以确定将它们发送到何处,所以如果他们登录,我不认为我能做到这一点。我怀疑它与this.redirect('login')vs this.render('login')

有关

这是我的登录路线代码

loginsignupController = BaseController.extend ({
    layoutTemplate: 'loginLayout',
    loadingTemplate: 'loading',
    yieldTemplates: {      
      'header': {to:'header'}
    },
    before: function() {      
      //check if logged in
      if(!!Meteor.user()){
        var org = Meteor.user().profile.organization;
        console.log('logged in');
        //check for rep, manager
        if (Roles.userIsInRole(Meteor.userId(), 'rep', org) ||   Roles.userIsInRole(Meteor.userId(), 'rep', 'default')){
          this.redirect('today')
        } else if (Roles.userIsInRole(Meteor.userId(), ['manager'], org)) {
          //if manager, send to manager home
          this.redirect('managerHome')
        }
      }
    }   
});

这里是rep路由(用户类型a)

RepController = BaseController.extend({
  layoutTemplate: 'repLayout',
  loadingTemplate: 'loading',
  yieldTemplates: {
    'sidebar': {to: 'sidebar'},
    'header': {to:'header'}
  },
  waitOn: function() {
  },
  data: function () {
  },
  before: function(){
      //check if logged in
      if(!Meteor.loggingIn() && !Meteor.user()) {
          this.redirect("/login");
      } else {
        var org = Meteor.user().profile.organization;
        console.log('logged in');
        //check for rep, manager
        if (Roles.userIsInRole(Meteor.userId(), ['manager'], org)) {        
          //if manager, send to manager home          
          this.redirect('/managerHome')          
        }
      };
   }})

谢谢!

1 个答案:

答案 0 :(得分:1)

发生此行为是因为您尚未处理用户数据尚未从服务器到达的情况。

当用户首先注销时,它会起作用,因为要登录所有订阅都必须完成。

所以当你直接加载浏览器页面时,你试图读取用户,但是用户还没有到达并且它会被卡住。 before不是被动的,所以当用户登录时,什么都不会改变。

要解决此问题,您需要发布用户的数据,并使用之前的waitOnthis.subscribe(..).wait()订阅该数据。

要记住的另一件事是Meteor.user()在初始加载期间更改3次:

  • 第一次null直到某些数据从服务器到达
  • 然后一些数据到达但配置文件字段为空(不确定为什么会这样)。当Meteor.user().profile.organizationMeteor.user().profile时,您会直接致电null,这会导致错误
  • 最后将填充所有数据并准备好访问。