2016-10-12 6 views
0

У меня есть маршрут, который должен быть AuthenticatedRouteMixin или UnauthenticatedRouteMixin в зависимости от ответа, возвращаемого с сервера. Как это реализовать?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. Есть некоторые непредвиденные последствия для этого. Если вы не вошли в систему и попробуйте войти в систему, пользователь должен обновить страницу до перенаправления на соответствующую страницу. Я заглянул в простой-auth-код, и функция 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.

Любая помощь будет очень признательна.

Update

Я могу заставить перезагрузки на пути входа или где-либо маршрут пользователя переходит к, но (я думаю) из-за вопросом 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

Спасибо Lux. Это не сработало для меня. Я вижу обновление сеанса, как и следовало ожидать, но «this.transitionTo (Configuration.routeIfAlreadyAuthenticated);» не переходит на маршрут, указанный в «Configuration.routeIfAlreadyAuthenticated». Мне еще нужно нажать «Обновить», чтобы увидеть перенаправление. – user2517182

+0

@ user2517182 то что-то не так с вашей конфигурацией или маршрутом. Постарайтесь обеспечить нерабочую работу. – Lux

+0

Я обновил свой код и сделал что-то похожее на то, что у вас здесь. Это решило мою проблему. Благодаря! – user2517182

 Смежные вопросы

  • Нет связанных вопросов^_^