2016-02-12 46 views
1

因此,我有一個簡單的ESA設置與自定義身份驗證器/授權人環繞基本HTTP身份驗證。登錄路由使用UnauthenticatedRouteMixin和登錄控制器基本上只是驗證針對自定義認證者,事後從REST服務獲取用戶對象:現在Ember簡單的身份驗證 - 驗證的承諾前確認的路由模型鉤子解決

export default Ember.Controller.extend({ 
    session: Ember.inject.service('session'), 

    actions: { 
    login() { 

     var self = this; 

     let { userName, password } = this.getProperties('userName', 'password'); 
     this.get('session').authenticate('authenticator:basicauth', userName, password).then(function() 
     { 

      self.store.queryRecord('user', { loginname : userName }).then(function (user) { 

       console.log(user.get('id')); 

       self.get('session').set('data.filterUserId', user.get('id')); 

      }); 

     }).catch((reason) => { 
      this.set('errorMessage', reason.error || reason); 
     }); 

    } 
    } 

}); 

,在第一證實的路徑(經由AuthenticatedRouteMixin),用於測試我也只是CONSOLE.LOG存儲會話屬性:

import Ember from 'ember'; 
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; 

export default Ember.Route.extend(AuthenticatedRouteMixin, { 

    session: Ember.inject.service('session'), 

    model: function() {  

     console.log(this.get('session.data.filterUserId')); 

    }, 

}); 

在控制檯輸出,我觀察到,該模型似乎鉤認證的承諾得到解決之前執行,即首先我得到「空」,那麼, ID。

如何使AuthenticatedRoute等待實際登錄驗證解決?

回答

1

只要認證成功,Ember簡單認證就會過渡到routeAfterAuthentication,當會話服務的authenticate方法返回的承諾解決時,該認證成功。你只是在這之後才異步加載用戶,儘管只是在已經完成轉換之後加載它。

對於當會話變得認證如何加載數據的例子看到虛擬應用程序的應用程序路徑:https://github.com/simplabs/ember-simple-auth/blob/master/tests/dummy/app/routes/application.js

你必須意識到的是,會話可以在當前標籤頁成爲驗證當用戶登錄/窗口,而且當用戶在另一個選項卡或窗口(其中sessionAuthenticated事件基本上可以在任何時候基本上被觸發)時登錄 - 這就是爲什麼在調用sessionAuthenticated方法時需要加載所需的所有數據在申請路線上(當然,您可以自己處理會話服務的authenticated事件,而不是使用ApplicationRouteMixin),而不是在由sessi在服務的authenticate方法解決。

+0

謝謝,現在它變得更清晰了。我懷疑我的混淆是'sessionAuthenticated'方法(及其與'authenticationSucceeded'事件的關係) - 可能是自述文件中的一個簡短示例會有所幫助... –

+0

後期跟進感到抱歉 - 我重新編寫了應用程序以遵循你的建議,但是我必須將'filterUser'屬性的設置移動到'loadCurrentUser()'方法以使其工作 –