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.

InformationsquelleAutor Daniel Grima | 2016-06-25
Schreibe einen Kommentar