簡體   English   中英

帶有HTTP請求和Observable的Angular2身份驗證防護

[英]Angular2 auth guard with http request and observables

我目前正在使用Spring Boot作為后端實現angular2示例應用程序。 我在前端身份驗證保護機制和可觀察變量方面遇到了一些問題。

我正在努力實現:

  1. 當有人輸入受保護的路由時,auth防護人員應檢查auth服務變量中是否已經設置了用戶
  2. 如果未設置,則應該發出http請求以檢查會話是否可用
  3. 服務方法應該返回一個true / false值(由於可能存在http請求,因此它是異步的)
  4. 如果服務返回false,則身份驗證防護應重定向到登錄頁面
  5. auth Guard應該返回true / false,因此路由可以激活或不激活

我的代碼當前看起來像這樣(我正在使用RC5 btw。):

驗證衛士

import {Injectable} from "@angular/core";
import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router} from "@angular/router";
import {Observable, Subject} from "rxjs/Rx";
import {AuthService} from "./auth.service";

@Injectable()
export class AuthGuard implements CanActivate {
  constructor(private authService: AuthService, private router: Router) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
    var authenticated = this.authService.isAuthenticated();
    var subject = new Subject<boolean>();
    authenticated.subscribe(
        (res) => {
          console.log("onNext guard: "+res);
          if(!res && state.url !== '/signin') {
            console.log("redirecting to signin")
            this.router.navigate(['/signin']);
          }
          subject.next(res);
        });
    return subject.asObservable();
  }
}

驗證服務

import {Injectable} from "@angular/core";
import {User} from "./user.interface";
import {Router} from "@angular/router";
import {Http, Response, Headers} from "@angular/http";
import {environment} from "../environments/environment";
import {Observable, Observer, Subject} from "rxjs/Rx";

@Injectable()
export class AuthService {
  private authenticatedUser : User;
  constructor(private router: Router, private http: Http) {}

  signupUser(user: User) {
  }


  logout() {
    //do logout stuff
    this.router.navigate(['/signin']);
  }

  isAuthenticated() : Observable<boolean> {
    var subject = new Subject<boolean>();
    if (this.authenticatedUser) {
      subject.next(true);
    } else {
      this.http.get(environment.baseUrl + '/user')
        .map((res : Response) => res.json())
        .subscribe(res => {
          console.log("next: returning true");
          this.authenticatedUser = User.ofJson(res);
          subject.next(true);
        }, (res) => {
          console.log("next: returning false");
          subject.next(false);
        });
    }
    return subject.asObservable();
  }
}

問題是:即使我登錄后,防護也永遠不會激活路由器組件。

謝謝您的幫助!

更改

return subject.asObservable();

return subject.asObservable().first();

路由器等待可觀察對象完成。 first()使它在第一個事件后完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM