2016-05-25 5 views
2

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

  1. Non authentifié et essayez d'accéder à un itinéraire à partir url
  2. 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 
     }); 
    } 
    } 
}); 

Répondre

1

Vous pouvez ajouter le précédent t rançon à l'intérieur des données de session, comme ceci

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

parce que cela est toujours conservé après l'invalidation de la session. Et puis récupérer du magasin, et faire la transition:

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

Merci beaucoup Igor. C'est très utile. – Panagiotis

0

Je l'ai résolu en utilisant invalidationSuccededhere.

this.get('session').on('invalidationSucceeded',() => this.transitionToRoute('dashboard'))