gpt4 book ai didi

angular - Angular 6 中的异步 authguard

转载 作者:太空狗 更新时间:2023-10-29 18:29:15 24 4
gpt4 key购买 nike

我想在以 Angular 授予对特定路由的访问权限之前提供服务器端身份验证。

我有一个实现 CanActivate 的 AuthGuard 和一个服务 AuthService。authService 已经有一个 private loggedIn: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(null);
订阅哪些 View 以了解用户是否登录。我真的不知道我的方法是否错误,但它似乎不起作用。

这是我在 auth.guard.ts 中的内容:

canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) : Observable<boolean> {
return this.authService.isAuthenticated().map((isLoggedIn) => {
if (isLoggedIn) {
return true;
} else {
this.router.navigate(['/login']);
return false;
}
})
}

这是 auth.service.ts:

    @Injectable()
export class AuthService {
private loggedIn: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(null);

constructor(
private router: Router,
private http: HttpClient
) {

}

get isLoggedIn() {
return this.loggedIn.asObservable();
}

isAuthenticated() : Observable<boolean> {
const headers = new HttpHeaders().set("X-Requested-With", "XMLHttpRequest");

return this.http.get('/user', {headers: headers}).map(
response => {
if (response['username']) {
this.loggedIn.next(true);
return true;
} else {
return false;
}
}
)
}

最佳答案

这是 RXJS6 的方法,在身份验证服务中添加了一个变量 _isAuthenticated 以在禁用标志时请求服务器状态。我希望这对其他人有帮助。

确保 canActivate 返回一个纯 bool 值或一个可观察值。路由处理程序将订阅给定的可观察对象并对来自值流的第一个 bool 值使用react。

auth.guard.ts

import { Injectable } from '@angular/core';
import { Router, CanActivate } from '@angular/router';

import { Observable } from 'rxjs/';
import { map, finalize } from 'rxjs/operators';
import { DataService } from '../data.service';
import { AuthenticationService } from './authentication.service';

@Injectable()
export class AuthenticationGuard implements CanActivate {

constructor(private router: Router,
private dataService: DataService,
private authenticationService: AuthenticationService) { }

canActivate(): any {
const isAuthenticated = this.authenticationService.isAuthenticated();

// All good
if ( isAuthenticated ) {
return true;

// Hmm, let's verify the user first
} else {
return this.authenticationService.isSessionAlive()
.pipe(
map(res => {

// No valid session; let's move to the login page
if ( res === false ) {
this.router.navigate(['/login'], { replaceUrl: true });
}

return res;
})
);
}
}

}

auth.service.ts(我使用的是 rxjs 6)

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { DataService } from '@app/core';

@Injectable()
export class AuthenticationService {

private _isAuthenticated = false;

constructor(
private dataService: DataService
) {}

isAuthenticated(): boolean {
return this._isAuthenticated;
}

isSessionAlive(): Observable<any> {
return Observable.create((observer) => {
this.dataService.SessionIsAlive()
.subscribe((res) => {
this._isAuthenticated = true;
observer.next(res.success); // your server response
}, (err) => {
this._isAuthenticated = false;
observer.next(false);
// observer.error(err); // won't work here you need to use next
});
});
}
}

关于angular - Angular 6 中的异步 authguard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50705101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com