2017-06-21 118 views
0

我有一個路線警衛,檢查用戶當前是否登錄:canActivate失敗不是重定向預期

import {Injectable} from "@angular/core" 
import {CanActivate} from "@angular/router" 

import {Observable} from "rxjs/Observable" 
import {UserService} from "./user.service" 

@Injectable() 
export class LoggedInGuard implements CanActivate { 
    constructor (private userService: UserService) {} 

    canActivate(): Observable<boolean> { 
     return this.userService.getLoginStatus() 
    } 
} 

user.service:

import {Injectable} from "@angular/core" 
import {Router} from "@angular/router" 

import {Observable} from "rxjs/Observable" 
import {AngularFireAuth} from "angularfire2/auth" 
import * as firebase from "firebase/app" 

@Injectable() 
export class UserService { 
    private user: firebase.User 

    constructor (private router: Router, private afAuth: AngularFireAuth) { 
     this.afAuth.authState.subscribe(user => { 
      this.user = user 
     }) 
    } 

    public login (email: string, password: string) { 
     this.afAuth.auth.signInWithEmailAndPassword(email, password).then(user => { 
      this.user = user 
      this.router.navigateByUrl("/dashboard") 
     }) 
    } 
    public logout() { 
     this.afAuth.auth.signOut() 
    } 
    public getLoginStatus(): Observable<boolean> { 
     return this.afAuth.authState.map(Boolean) 
    } 
} 

而且從/重定向到/login

{path: "", redirectTo: "login", pathMatch: "full"} 

一切正常,當用戶登錄,或者如果我不適用直接轉到//login(前者正確地重定向到後者)。但是,如果我嘗試在未登錄的情況下導航到受保護的路由,它會將我重定向到/,但不是再次重定向,而是停在空白頁面上。

是否有第二重定向不起作用的原因?或者更好的做法是讓後衛直接去/login,但我不確定如何在可觀察的情況下做到這一點。

回答

1

我不確定您的方法是否可行,但作爲解決方法,如果getLoginStatus()返回false,則可以簡單地在LoggedInGuard中調用this.router.navigate(['/login'])

@ see example:Angular 2 AuthGuard Service with redirect?