Eckige 2-Router - CanActivate Guard
Ich bin Implementierung einer CanActivate Wache leiten den Benutzer auf die login-Seite, wenn Ihre Sitzung ist ungültig.
Die überprüfen, ob die session gültig ist oder nicht wird durch ein service und so von der Wache ich, bin und abonnieren Sie den service anrufen, um die Gültigkeit der Sitzung Stand.
Habe ich debuggt den code und alles scheint zu funktionieren wie es sollte, in der Tat, wenn die Sitzung ungültig ist die app keine Umleitung zurück auf die login-Seite. Aber wenn ich zurück true
von der Wache, die Seite wird nicht geladen.
Mein code ist ähnlich zu dem, was auf der Winkel-Dokumentation (Code auf Plunker).
Ich bin mir nicht sicher, ob ich habe etwas falsch umgesetzt in der Wache selbst. Der Unterschied, dass ich sehen kann, ist, dass der guard ist der Zugriff auf eine Eigenschaft in der service -, aber ich glaube nicht, dass, sollte die Angelegenheit viel. Von was ich verstehen kann Rückkehr true
von der Garde würde einfach weiterhin die normalen routing-Betrieb.
Hinweis: ich bin mit Winkel-RC3
Code:
Guard
export class MyGuard implements CanActivate {
constructor(private checkSessionService: CheckSessionService, private router: Router) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
) {
this.checkSessionService.checkUserSession(localStorage.getItem('userToken'))
.subscribe(validSessionReturn => {
if (validSessionReturn) {
return true;
} else {
//redirect to login
this.router.navigateByUrl('/login');
return false;
}
},
error => console.log(error));
}
}
Bearbeiten
Habe ich weiter untersucht, und es sieht aus wie das Problem das ich habe ist mit der Tatsache zu tun, dass ich versuche, die Rückkehr der boolean
von der subscribe-Methode selbst. Als test habe ich versucht, die folgenden, und alles funktionierte wie erwartet:
export class MyGuard implements CanActivate {
constructor(private checkSessionService: CheckSessionService, private router: Router) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
) {
if(localStorage.getItem('userToken') !== null) {
return true; //or return Observable.of(true);
} else {
return false; //or return Observable.of(false);
}
}
}
Hinweis Sie können aus dem obigen code, kann man wieder entweder eine boolean
oder eine Observable<boolean>
. Die CheckSessionService
habe ich umgesetzt, hat eine Rückkehr Observable<boolean>
. In der Tat, wenn ich versuchte den code unten ein, sobald wieder alles funktioniert wie erwartet, was bedeutet, dass, wenn die Sitzung gültig ist die Seite erfolgreich geladen wurde, andernfalls routing ist gestoppt:
export class MyGuard implements CanActivate {
constructor(private checkSessionService: CheckSessionService, private router: Router) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
) {
return this.checkSessionService.checkUserSession(localStorage.getItem('userToken'));
}
}
Jedoch mit dem oben genannten Beispiel, ich kann nicht einen Weg finden, mit redirect auf eine bestimmte Seite basierend auf dem Wert abgerufen, indem die service. Meine Frage ist nun, ob es einen Weg gibt, um zu überprüfen, das Ergebnis der this.checkSessionService.checkUserSession(localStorage.getItem('userToken'))
ohne eine subscribe-Methode, oder gibt es einen anderen Weg, wie die Rückkehr aus der subscribe
Methode. Ich habe versucht:
if(this.checkSessionService.checkUserSession(localStorage.getItem('userToken')) === Observable.of(false))
aber wie erwartet funktionierte es nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersetzen
durch
Statt der Anmeldung zu dem beobachtbaren und der Rückkehr der subscrption, müssen Sie auch zurück, dass die observable selbst, sondern ein plug-etwas, falls es falsch ist:
Subscription
statt einerboolean
oderObservable<boolean>
was nicht erlaubt ist. Ich bin mir sicher, dass der code, den ich habe, ist in Ordnung, es ist nur so, dass bei der Rückkehrtrue
es ist so, als ob ich zurückkehren werdefalse
und beendet den routing-Betrieb.do
- operator erlaubt es zu tun. reactivex.io/documentation/operators/do.html. " return this.checkSessionService.checkUserSession(localStorage.getItem('userToken')).do(function(authenticated) { if (!authentifiziert wird) ... });subscribe
Funktion und dachte, es sollte in diesem Fall als gut, aber ich war falsch. Vielen Dank für Eure Hilfe. 🙂