2016-10-12 60 views
0

根據從服務器返回的響應,我有一條路線應該是AuthenticatedRouteMixinUnauthenticatedRouteMixin。我如何實現這一點?根據條件,Ember simple-auth AuthenticatedRouteMixin或UnauthenticatedRouteMixin

目前,我有一個路線AuthenticatedRouteMixin,我強制要通過重寫我的beforeModel和執行willTransition操作進行身份驗證和取消身份驗證,如下所示。

beforeModel() { 
    this.set('session.isAuthenticated', true); 
    return this._super(...arguments); 
} 

而且

actions: { 
    willTransition: function(){ 
     if (Ember.isEmpty(_this.get('session.data.authenticated.token'))) 
     { 
     this.set('session.isAuthenticated', false); 
     } 
    } 
    } 

然而,與此兩個問題。

  1. 它看起來感覺不對。這可能有更好的方法來做 。
  2. 這有一些意想不到的後果。如果未登錄然後嘗試登錄,用戶需要在重定向到相應頁面之前刷新頁面。我研究了簡單授權代碼,並且transitionTo函數不按預期方式工作。

    sessionAuthenticated() { 
        const attemptedTransition = this.get('session.attemptedTransition'); 
    
        if (attemptedTransition) { 
        attemptedTransition.retry(); 
        this.set('session.attemptedTransition', null); 
        } else { 
        this.transitionTo(Configuration.routeAfterAuthentication); 
        } 
    } 
    

this.transitionTo(Configuration.routeAfterAuthentication);是未轉換的線。我已驗證Configuration.routeAfterAuthentication設置正確。

我可能會強制重新加載登錄路徑或用戶導航到的路徑,但(我認爲)因爲上述問題2,我正在運行到無限重定向。

我很樂意這樣做如下:

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

const { service } = Ember.inject; 

var mixin; 
if (service('session').isAuthenticated){ 
    mixin = AuthenticatedRouteMixin; 
} 
else{ 
    mixin = UnauthenticatedRouteMixin; 
} 

export default Ember.Route.extend(mixin, { ... }) 

但是,我沒有得到來自會話信息。我不確定,但也許需要加載特定的Ember.Route才能獲取該信息。

任何幫助將不勝感激。

更新

我可以強制重新加載在登錄路由或者其它任何途徑用戶 導航到,但(我認爲),因爲上述問題2,我正在 到無限的重定向。

我想出了這部分。我只是在會話中設置一個鍵/值。如果它是真的,重新加載並移除該鍵或將其設置爲false,所以重新加載只發生一次。

回答

0

那麼,正確的做法是在路線中手動執行混合。退房source code.

它不那麼難吧?有趣的是:爲什麼當會話通過驗證時想要AuthenticatedRouteMixin,當會話不通過時需要UnauthenticatedRouteMixin?這基本上與不包含任何混音時的行爲相同。

由於AuthenticatedRouteMixin僅更改會話未通過身份驗證時的行爲,並且UnauthenticatedRouteMixin僅更改路由通過身份驗證時的行爲。

但這樣的事情在你的路線是你問什麼:

beforeModel(transition) { 
    if(...) { 
    if (!this.get('session.isAuthenticated')) { 
     transition.abort(); 
     this.set('session.attemptedTransition', transition); 
     this.transitionTo(Configuration.authenticationRoute); 
     return; 
    } 
    } else { 
    if (this.get('session').get('isAuthenticated')) { 
     transition.abort(); 
     this.transitionTo(Configuration.routeIfAlreadyAuthenticated); 
     return; 
    } 
    } 
    return this._super(...arguments); 
}, 
+0

感謝力士。這對我不起作用。我可以像預期的那樣看到會話更新,但'this.transitionTo(Configuration.routeIfAlreadyAuthenticated);'不會進入'Configuration.routeIfAlreadyAuthenticated'中指定的路由。我仍然需要點擊刷新才能看到重定向。 – user2517182

+0

@ user2517182那麼你的配置或路由有問題。嘗試提供一個不工作的旋轉。 – Lux

+0

我修改了我的代碼並做了類似於您在此處的操作。這解決了我的問題。謝謝! – user2517182