为什么auth服务不记得身份验证?

时间:2018-03-27 13:14:00

标签: typescript angular2-services

我有一个正常工作的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#loggedInfalse,但我已经过身份验证。

1 个答案:

答案 0 :(得分:1)

您需要先在localStorage中以新标签页(或页面刷新)阅读user

尝试将此添加到AuthService的构造函数:

try {
  let userJson = window.localStorage.getItem('user');
  let user = JSON.parse(userJson);
  this.isLoggedIn = !!user;
} catch (e) {
  // no user
}