2016-10-12 6 views
0

Ich habe eine Route, die AuthenticatedRouteMixin oder UnauthenticatedRouteMixin sein sollte, je nachdem, welche Antwort vom Server kommt. Wie implementiere ich das?Ember simple-auth AuthenticatedRouteMixin oder UnauthenticatedRouteMixin unterwegs je nach Zustand

Derzeit habe ich eine Route mit AuthenticatedRouteMixin und ich erzwinge die Route authentifiziert und De-authenticated durch überschreiben mein beforeModel und Implementieren der Aktion willTransition wie folgt.

beforeModel() { 
    this.set('session.isAuthenticated', true); 
    return this._super(...arguments); 
} 

Und

actions: { 
    willTransition: function(){ 
     if (Ember.isEmpty(_this.get('session.data.authenticated.token'))) 
     { 
     this.set('session.isAuthenticated', false); 
     } 
    } 
    } 

Allerdings gibt es zwei Probleme mit diesem.

  1. Es sieht aus und fühlt sich falsch an. Es gibt wahrscheinlich einen besseren Weg zu tun dies.
  2. Es gibt einige unbeabsichtigte Konsequenzen. Wenn Sie nicht angemeldet sind und versuchen, sich anzumelden, muss ein Benutzer die Seite aktualisieren, bevor er auf die entsprechende Seite umgeleitet wird. Ich habe in den Simple-Auth-Code geschaut und eine transitionTo-Funktion verhält sich nicht wie erwartet.

    sessionAuthenticated() { 
        const attemptedTransition = this.get('session.attemptedTransition'); 
    
        if (attemptedTransition) { 
        attemptedTransition.retry(); 
        this.set('session.attemptedTransition', null); 
        } else { 
        this.transitionTo(Configuration.routeAfterAuthentication); 
        } 
    } 
    

this.transitionTo(Configuration.routeAfterAuthentication); ist die Linie, die nicht Übergang ist. Ich habe überprüft, dass Configuration.routeAfterAuthentication richtig eingestellt ist.

Ich kann ein Neuladen auf der Login-Route oder wo immer Route ein Benutzer navigiert zu zwingen, aber (ich denke), wegen der Frage 2 oben, ich stoße in unendliche Weiterleitungen.

Ich würde gerne so etwas wie die folgenden Funktionen ausführen:

import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; 
import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin'; 

const { service } = Ember.inject; 

var mixin; 
if (service('session').isAuthenticated){ 
    mixin = AuthenticatedRouteMixin; 
} 
else{ 
    mixin = UnauthenticatedRouteMixin; 
} 

export default Ember.Route.extend(mixin, { ... }) 

Ich bin jedoch Informationen nicht von der Sitzung zu bekommen. Ich bin mir nicht sicher, aber vielleicht muss die spezifische Ember.Route geladen werden, um diese Informationen zu bekommen.

Jede Hilfe würde sehr geschätzt werden.

aktualisieren

ich auf der Login-Route einen Reload zwingen kann oder wo auch immer Route einen Benutzer navigiert, aber (ich glaube), weil der Ausgabe 2 oben, ich bin mit in den unendlichen Umleitungen.

Ich habe diesen Teil herausgefunden. Ich habe nur einen Schlüssel/Wert in der Sitzung festgelegt. Wenn dies der Fall ist, laden Sie den Schlüssel neu und entfernen Sie ihn, oder legen Sie ihn auf false fest, sodass das erneute Laden nur einmal erfolgt.

Antwort

0

Nun, der richtige Weg, dies zu tun, ist zu tun, was das Mischen manuell in Ihrer Route macht. Schauen Sie sich die source code.

Es ist nicht so schwer, oder? Das Interessante ist: Warum möchten Sie die AuthenticatedRouteMixin haben, wenn die Sitzung authentifiziert wird und die UnauthenticatedRouteMixin, wenn die Sitzung nicht ist? Das ist im Grunde das gleiche Verhalten, als wenn Sie keine Mischung einbeziehen würden.

Da die AuthenticatedRouteMixin nur das Verhalten ändert, wenn die Sitzung nicht authentifiziert ist, und UnauthenticatedRouteMixin ändert nur das Verhalten, wenn die Route authentifiziert ist.

Aber so etwas in Ihrer Route ist das, was Sie gefragt:

beforeModel(transition) { 
    if(...) { 
    if (!this.get('session.isAuthenticated')) { 
     transition.abort(); 
     this.set('session.attemptedTransition', transition); 
     this.transitionTo(Configuration.authenticationRoute); 
     return; 
    } 
    } else { 
    if (this.get('session').get('isAuthenticated')) { 
     transition.abort(); 
     this.transitionTo(Configuration.routeIfAlreadyAuthenticated); 
     return; 
    } 
    } 
    return this._super(...arguments); 
}, 
+0

Dank Lux. Das hat nicht für mich funktioniert. Ich kann das Sitzungsupdate so sehen, wie ich es erwarte, aber 'this.transitionTo (Configuration.routeIfAlreadyAuthenticated);' geht nicht zu der in 'Configuration.routeIfAlreadyAuthenticated' angegebenen Route. Ich muss noch auf Aktualisieren klicken, um die Umleitung zu sehen. – user2517182

+0

@ user2517182 dann stimmt etwas mit Ihrer Konfiguration oder Route nicht. Versuchen Sie, ein nicht funktionierendes Twiddle bereitzustellen. – Lux

+0

Ich habe meinen Code überarbeitet und etwas ähnliches wie hier gemacht. Das hat mein Problem gelöst. Vielen Dank! – user2517182

Verwandte Themen