2014-02-21 63 views
0

我的基本設置是我有一個登錄頁面,代表頁面和管理頁面。從簡歷中處理用戶驗證鐵路由器的最佳方式

我建立了我的鐵路由器的路由,並把一些掛鉤之前,驗證是否有適當角色的用戶。對於登錄頁面,我想查看是否有用戶,是什麼類型的用戶(使用角色),然後發送到他們正確的頁面(如果他們已經登錄)。對於用戶類型頁面,我想檢查是否存在一個用戶,確保他們在正確的地方,如果沒有,將他們發回登錄頁面或正確的頁面。

每個用戶都有一個角色( '代表',organizationId),並在profile.organization的組織。我檢查他們在組織中的角色。

這一切都很好,除非有人恢復會話。如果他們從註銷開始,它會順風順水,但如果他們昨天登錄並打開網站備份,它只是位於登錄頁面。我認爲這是因爲他們正在重新登錄。

因此,問題是,處理檢查以查看用戶是否已登錄或登錄的最佳方法是什麼。棘手的部分是我需要從用戶配置文件來確定將它們發送到哪裏,所以如果他們登錄,我認爲我不能這樣做。我懷疑它是與this.redirect(「登錄」)VS this.render(「登錄」)

這裏是我的登錄路由

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') 
     } 
     } 
    } 
}); 

代碼,並在這裏它是爲代表路線(用戶類型)

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

此行爲發生,因爲你還沒有處理,其中用戶的數據尚未從服務器到達的情況。

它的工作原理,當用戶註銷第一,因爲他們登錄您的所有訂閱必須是完整的。

所以會發生什麼是當你直接加載瀏覽器頁面,你嘗試讀取用戶,但用戶還沒有到來,有點它卡住。 before沒有反應,所以當用戶登錄時,什麼都不會改變。

要解決這個問題,您需要發佈用戶的數據並在之前使用waitOnthis.subscribe(..).wait()進行訂閱。

另一件事要記住的是Meteor.user()初始負荷時的變化3次:

  • 第一次的null直到一些數據從
  • 那麼一些數據到達服務器到達,但配置文件字段空的(不確定這是爲什麼)。你直接撥Meteor.user().profile.organizationMeteor.user().profilenull它會導致一個錯誤
  • 最後所有的數據將被填充,它將準備好訪問。
+0

感謝@Akshat。我的印象是,.wait()實際上不會等待訂閱來運行其他的東西,只是等待呈現頁面。我會試一試,看看它是如何發展的。 –

相關問題