2016-05-25 16 views
2

Wir verwenden ember-simple-auth mit Cookie-Authentifizierung und wir möchten zur zuletzt aufgerufenen Route umleiten, nachdem wir uns erneut angemeldet haben, wenn der Cookie abläuft.

Wir verwalten die Umleitung für die folgenden Szenarien zu tun:Emberjs: Wie zur zuletzt aufgerufenen Route umgeleitet wird, nachdem Sitzung ungültig gemacht wurde

  1. nicht authentifiziert und versuchen, aus url
  2. und ein Element auswählen, aus dem Navigationsmenü

beide nicht authentifiziert eine Route zu gelangen, Nach erfolgreicher Authentifizierung wurden wir auf die angeforderte Route umgeleitet.

Aber wir möchten, wenn unser Sitzungscookie abgelaufen ist und der Benutzer versucht, auf eine Route zuzugreifen, um die Sitzung ungültig zu machen und den Benutzer zurück zur Authentifizierungsseite umzuleiten. Wenn sich der Benutzer wieder anmeldet, wollen wir ihn auf die gewünschte Route umleiten.

Momentan speichern wir den vorherigen Übergang, damit wir die Umleitung durchführen können, aber nachdem wir die Sitzung ungültig gemacht haben, gehen die Daten verloren.

Was ist der beste Weg, dies zu tun?

Unser Code wie folgt aussieht:

Individuelle 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(); 
     }); 
    }); 
    } 
}); 

Applikationsweg:

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(); 
     } 
     } 
    } 
    } 
}); 

Authentifizierung Strecke

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 
     }); 
    } 
    } 
}); 

Antwort

1

Sie die vorherige t hinzufügen Ein Übergang innerhalb der Sitzungsdaten, wie dieser

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

, weil das nach dem Ungültigmachen der Sitzung weiterhin besteht. Und es dann aus dem Laden zurück und machen den Übergang:

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

Vielen Dank Igor. Das ist sehr hilfreich. – Panagiotis

0

Ich löste es durch invalidationSuccededhere verwenden.

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