2016-10-12 37 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