我有一个正常工作的auth guard和auth服务。但是当我尝试在新的浏览器选项卡中打开我的应用程序时,我还没有登录。我的应用程序需要再次登录我。我认为auth服务必须记住我,而应用程序不会重新启动,但不起作用。如何更改此项以记住我而不输入每个新标签的登录名和密码?
@Injectable()
export class AuthService {
private loggedIn = false;
get isLoggedIn() {
return this.loggedIn;
}
constructor(private router: Router) {
}
login(user: User) {
this.loggedIn = true;
window.localStorage.setItem('user', JSON.stringify(user));
this.router.navigate(['/vds-list']);
}
logout() {
this.loggedIn = false;
window.localStorage.clear();
this.router.navigate(['/login']);
}
}
@Injectable()
export class AuthGuard implements CanActivate, CanActivateChild {
constructor(private authService: AuthService, private router: Router) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
console.log(state.url);
if (this.authService.isLoggedIn) {
return true;
} else {
this.router.navigate(['/login'], {
queryParams: {
accessDenied: true
}
});
return false;
}
}
canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return this.canActivate(childRoute, state);
}
}
我有一个loggedIn
变量,isLoggedIn
方法在成功进行一次身份验证后必须返回true
,但遗憾的是它仅适用于同一个标签。或者换句话说AuthService#loggedIn
为false
,但我已经过身份验证。
答案 0 :(得分:1)
您需要先在localStorage中以新标签页(或页面刷新)阅读user
。
尝试将此添加到AuthService
的构造函数:
try {
let userJson = window.localStorage.getItem('user');
let user = JSON.parse(userJson);
this.isLoggedIn = !!user;
} catch (e) {
// no user
}