Nous utilisons ember-simple-auth avec authentification par cookie et nous voulons rediriger vers la dernière route accédée après que nous nous soyons reconnectés lorsque le cookie expire.
Nous parvenons à faire la redirection pour les scénarios suivants:Emberjs: comment rediriger vers la dernière route accessible après la session invalidée
- Non authentifié et essayez d'accéder à un itinéraire à partir url
- Non authentifié et sélectionnez un élément dans le menu de navigation
deux, après une authentification réussie, nous avons redirigé vers l'itinéraire demandé. Mais, nous voulons quand notre cookie de session a expiré et l'utilisateur essaie d'accéder à un itinéraire pour invalider la session et rediriger l'utilisateur vers la page d'authentification. Lorsque l'utilisateur se reconnecte, nous voulons le rediriger vers l'itinéraire demandé.
Pour l'instant nous stockons la transition précédente afin que nous puissions faire la redirection mais après que nous invalidons la session les données sont perdues.
Quelle est la meilleure façon de faire cela?
Notre code ressemble:
sur mesure 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();
});
});
}
});
Voie d'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();
}
}
}
}
});
authentification Route
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
});
}
}
});
Merci beaucoup Igor. C'est très utile. – Panagiotis