Angular2,工厂守卫可能吗?
Angular2, factory guard is possible?
我非常信任我的网站,所以为了建立安全路线,我建立了下一个守卫:
export class TrustGuard implements CanActivate {
constructor(private router: Router) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return /*Check if user has the trust or not*/;
}
}
所以,在路由中我可以添加像 canActivate: [TrustGuard]
这样的守卫
问题是我的托拉斯太多了,因此我需要为每个托拉斯建立一个守卫。所以我正在尝试建立一个警卫工厂,以避免实施太多类似的警卫。
我的目标是找到设置路线的方式
canActivate: [FactoryTrustGuard(Trust.seeDashboard)]
这可能吗?
这可能会导致 AOT 出现问题,因为路由定义应该是静态的。
守卫可以干掉大部分样板代码:
export abstract class TrustGuard {
protected abstract trust: string;
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
/* check against this.trust */
}
}
export class FooTrustGuard extends TrustGuard {
protected trust = Trust.foo;
}
如果有几十个类似的守卫,可以做成一个守卫,通过路由数据传递一个角色:
export class TrustGuard {
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
const trust = route.data['trust'];
if (trust in Trust) {
...
} else {
throw ...;
}
}
}
并像这样使用它
{ route: ..., canActivate: [TrustGuard], data: { trust: Trust.seeDashboard } }
我非常信任我的网站,所以为了建立安全路线,我建立了下一个守卫:
export class TrustGuard implements CanActivate {
constructor(private router: Router) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return /*Check if user has the trust or not*/;
}
}
所以,在路由中我可以添加像 canActivate: [TrustGuard]
问题是我的托拉斯太多了,因此我需要为每个托拉斯建立一个守卫。所以我正在尝试建立一个警卫工厂,以避免实施太多类似的警卫。
我的目标是找到设置路线的方式
canActivate: [FactoryTrustGuard(Trust.seeDashboard)]
这可能吗?
这可能会导致 AOT 出现问题,因为路由定义应该是静态的。
守卫可以干掉大部分样板代码:
export abstract class TrustGuard {
protected abstract trust: string;
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
/* check against this.trust */
}
}
export class FooTrustGuard extends TrustGuard {
protected trust = Trust.foo;
}
如果有几十个类似的守卫,可以做成一个守卫,通过路由数据传递一个角色:
export class TrustGuard {
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
const trust = route.data['trust'];
if (trust in Trust) {
...
} else {
throw ...;
}
}
}
并像这样使用它
{ route: ..., canActivate: [TrustGuard], data: { trust: Trust.seeDashboard } }