angular - 如果用户在 AuthGuard 的 canActivate 功能中处于空闲状态,则 Angular 中的会话超时
问题描述
当前在应用程序中,如果用户未通过身份验证,则他无法继续任何路线,但如果他/她已通过身份验证,则可以进行导航。这是通过 auth guard 中的 canActivate 函数实现的。如果我想在 5 分钟后用户空闲的情况下也有会话超时,那么通过 canActivate 函数和 Auth-Guard 实现它的方法是什么?
import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private router: Router) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (sessionStorage.getItem('currentUser')) {
// logged in so return true
return true;
}
// not logged in so redirect to login page with the return url
this.router.navigate(['/'], { queryParams: { returnUrl: state.url }});
return false;
}
}
解决方案
您可以使用基于令牌的 api 通信,创建具有过期时间的令牌。使用以下库进行令牌通信
npm install --save @auth0/angular-jwt
并使用 Auth 服务类
import { Injectable } from '@angular/core';
import { JwtHelperService } from '@auth0/angular-jwt';
@Injectable()
export class AuthService {
constructor(public jwtHelper: JwtHelperService) {}
public isAuthenticated(): boolean {
const token = localStorage.getItem('token');
// Check whether the token is expired and return
// true or false
return !this.jwtHelper.isTokenExpired(token);
}
}
并且改变canActivate方法如下
canActivate(): boolean {
if (!this.auth.isAuthenticated()) {
this.router.navigate(['login']);
return false;
}
return true;
}
编辑
您可以使用令牌或 cookie。代码如下
import { Injectable } from '@angular/core';
import { Cookie } from 'ng2-cookies/ng2-cookies';
@Injectable()
export class AuthCookie {
constructor() { }
getAuth(): string {
return Cookie.get('id_token');
}
setAuth(value: string): void {
//use for 5 minuts, Cookies value set seconds to days, 5/1440
Cookie.set('cookie_token', value, 0.003472);
}
deleteAuth(): void {
Cookie.delete('id_token');
}
}
推荐阅读
- java - 在每 3 次后关闭对话框时显示 Admob 插页式广告
- mysql - 内部连接的“字段列表”中的未知列
- python - 如何将具有相同键值的 Python 字典列表转换为具有值列表的字典
- laravel - Laravel 自定义重定向()-> 意图
- c# - ASP.NET Core 调用 Google API 获取联系人或电子邮件
- visual-studio - 如何在 Visual Studio Code 中打开我的 Windows 终端设置
- android - 如何为 Android 创建 Ziggeo 嵌入式录像机
- java - org.json 无法解析为模块?
- azure - Azure 应用服务编辑器是否可用于 Linux 应用服务?
- python - 访问在 TF 2.0 中未明确公开为层的 Keras 模型的中间张量