bixi
Version:
企业级中后台前端解决方案
60 lines (54 loc) • 1.81 kB
text/typescript
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 }
* ],
* },
* ```
*/
export class JWTGuard implements CanActivate, CanActivateChild, CanLoad {
private url: string | undefined;
private get cog() {
return this.srv.options;
}
constructor( 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();
}
}