2016-10-12 5 views
0

나는 서버에서 오는 응답에 따라 AuthenticatedRouteMixin 또는 UnauthenticatedRouteMixin이어야하는 경로가 있습니다. 어떻게 구현합니까?Ember 간단한 인증 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 함수가 예상대로 작동하지 않습니다.

this.transitionTo(Configuration.routeAfterAuthentication);

sessionAuthenticated() { 
    const attemptedTransition = this.get('session.attemptedTransition'); 

    if (attemptedTransition) { 
    attemptedTransition.retry(); 
    this.set('session.attemptedTransition', null); 
    } else { 
    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의 내가 로그인 경로 나 위치를 어느 경로 사용자를 를 탐색에에서 다시로드를 강제 할 수 있지만 (내 생각)

업데이트, 나는 무한 리디렉션에 을 실행하고 있습니다.

나는이 부분을 발견했다. 방금 세션에서 키/값을 설정했습니다. true 인 경우 키를 다시로드하고 제거하거나 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