UNPKG

bixi

Version:

企业级中后台前端解决方案

60 lines (54 loc) 1.81 kB
import { Inject, Injectable, Injector } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate, CanActivateChild, CanLoad, Route, RouterStateSnapshot, UrlSegment } from '@angular/router'; import { CheckJwt, ToLogin } from '../helper'; import { BIXI_SERVICE_TOKEN, ITokenService } from '../interface'; import { JWTTokenModel } from './jwt.model'; /** * JWT 路由守卫, [ACL Document](https://bixi.datagrand.com/auth/guard). * * ```ts * data: { * path: 'home', * canActivate: [ JWTGuard ] * }, * { * path: 'my', * canActivateChild: [JWTGuard], * children: [ * { path: 'profile', component: MockComponent } * ], * }, * ``` */ @Injectable({ providedIn: 'root' }) export class JWTGuard implements CanActivate, CanActivateChild, CanLoad { private url: string | undefined; private get cog() { return this.srv.options; } constructor(@Inject(BIXI_SERVICE_TOKEN) private srv: ITokenService, private injector: Injector) { } private process(): boolean { // tslint:disable-next-line:no-non-null-assertion const res = CheckJwt(this.srv.get<JWTTokenModel>(JWTTokenModel), this.cog.token_exp_offset!); if (!res) { console.warn('[@bixi/auth](jwt guard): token 不存在或已过期,前往登录页'); ToLogin(this.cog, this.injector, this.url); } return res; } // lazy loading canLoad(route: Route, _segments: UrlSegment[]): boolean { this.url = route.path; return this.process(); } // all children route canActivateChild(_childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { this.url = state.url; return this.process(); } // route canActivate(_route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { this.url = state.url; return this.process(); } }