Мы используем ember-simple-auth с аутентификацией cookie, и мы хотим перенаправить на последний доступный маршрут после того, как мы снова войдем в систему, когда истекает срок действия файла cookie.
Нам удается сделать переадресацию для следующих сценариев:Emberjs: Как перенаправить на последний доступный маршрут после сеанса недействительным
- не заверены и пытаются получить доступ к маршруту из URL
- Не заверены и выберите пункт меню навигации
И, после успешной аутентификации мы перенаправляемся на запрошенный маршрут.
Но мы хотим, чтобы срок действия нашего 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
});
}
}
});
Большое спасибо Игорю. Это очень полезно. – Panagiotis