【发布时间】:2018-07-16 22:15:16
【问题描述】:
在我授予对特定路由的 Angular 访问权限之前,我想提供服务器端身份验证。
我有一个实现 CanActivate 的 AuthGuard 和一个服务 AuthService。
authService 已经有一个 private loggedIn: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(null);
视图订阅,以便了解用户是否登录。我真的不知道我的方法是否错误,但它似乎不起作用。
这就是我在 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;
}
}
)
}
【问题讨论】:
-
错误是什么?有什么反馈吗?
-
好吧,此时错误只是一个 401,我想我可以处理,但我觉得我已经尝试了很多事情但没有成功,我只想知道我是否在正确的轨道上......我什至应该让 canActivate 返回一个 Observable 还是一个布尔值? isAuthenticated 也应该提供 Observable 吗?登录变量呢,它是必需的吗?我需要isLoggedIn 和 isAuthenticated,不一样吗?等等...我有点迷茫,真的,我找到了一些代码 sn-ps 但无法让它们工作...