2016-05-25 2 views
2

Мы используем ember-simple-auth с аутентификацией cookie, и мы хотим перенаправить на последний доступный маршрут после того, как мы снова войдем в систему, когда истекает срок действия файла cookie.

Нам удается сделать переадресацию для следующих сценариев:Emberjs: Как перенаправить на последний доступный маршрут после сеанса недействительным

  1. не заверены и пытаются получить доступ к маршруту из URL
  2. Не заверены и выберите пункт меню навигации

И, после успешной аутентификации мы перенаправляемся на запрошенный маршрут.

Но мы хотим, чтобы срок действия нашего cookie сеанса истек, и пользователь пытается получить доступ к маршруту, чтобы аннулировать сеанс и перенаправить пользователя обратно на страницу аутентификации. Когда пользователь регистрируется, мы хотим перенаправить его на запрошенный маршрут.

На данный момент мы сохраняем предыдущий переход, поэтому мы можем выполнить перенаправление, но после того, как мы аннулируем сеанс, данные теряются.

Каков наилучший способ для этого?

Наш код выглядит следующим образом:

Пользовательские Authenticator

import Ember from 'ember'; 
import Base from 'ember-simple-auth/authenticators/base'; 

export default Base.extend({ 
    restore() { 
    return new Ember.RSVP.Promise(function(resolve, reject) { 
     let sessionCookie = window.Cookies.get('beaker.session.id'); 
     if(!window.isUndefined(sessionCookie)) { 
     resolve(true); 
     }else{ 
     reject(); 
     } 
    }); 
    }, 
    authenticate(data) { 
    return new Ember.RSVP.Promise(function (resolve, reject) { 
     Ember.$.ajax({ 
     type: 'post', 
     url: '/core/authentication/basic/login', 
     data: data 
     }).then((response) => { 
     resolve({ 
      responseText: response 
     }); 
     }, (error) => { 
     reject(error); 
     }); 
    }); 
    }, 
    invalidate() { 
    return new Ember.RSVP.Promise(function (resolve, reject) { 
     Ember.$.ajax({ 
     type: 'post', 
     url: '/core/authentication/basic/logout' 
     }).then(() => { 
     resolve(true); 
     },() => { 
     reject(); 
     }); 
    }); 
    } 
}); 

Application Маршрут:

import Ember from 'ember'; 
import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin'; 

export default Ember.Route.extend(ApplicationRouteMixin, { 
    session: Ember.inject.service('session'), 
    beforeModel(transition) { 
    if(!this.get('session.isAuthenticated') && transition.targetName !== 'core.authentication') { 
     this.set('previousTransition', transition); 
     this.transitionTo('core.authentication'); 
    } 
    }, 
    actions: { 
    willTransition(transition) { 
     if (!this.get('session.isAuthenticated')) { 
     this.set('previousTransition', transition); 
     } else { 
     let previousTransition = this.get('previousTransition'); 
     if (previousTransition) { 
      this.set('previousTransition', null); 
      previousTransition.retry(); 
     } 
     } 
    } 
    } 
}); 

Authentication Маршрут

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    session: Ember.inject.service('session'), 
    actions: { 
    login() { 
     let that = this; 
     let { username, password } = this.controller.getProperties('username', 'password'); 
     let data = {username: username, password: password}; 

     if(this.get('session.isAuthenticated')) { 
     this.get('session').invalidate(); 
     } 

     this.get('session').authenticate('authenticator:basic', data).then(() => { 
     let data = that.get('session.data.authenticated'); 
     // show response message 
     }, (error) => { 
     // show error 
     }); 
    } 
    } 
}); 

ответ

1

Вы можете добавить предыдущую т перераспределение внутри данных сеанса, например,

this.get('session').set('data.previousTransition', transition.targetName); 

потому что это по-прежнему сохраняется после того, как сессия признана недействительной. А затем получить его обратно из магазина, и сделать переход:

this.get('session.store').restore().then(data => { 
    if (data.previousTransition !== null) { 
    this.transitionTo(data.previousTransition) 
    } 
}) 
+0

Большое спасибо Игорю. Это очень полезно. – Panagiotis

0

я решил его с помощью invalidationSuccededhere.

this.get('session').on('invalidationSucceeded',() => this.transitionToRoute('dashboard')) 
Смежные вопросы