Angular2, возможна заводская охрана?
У меня много сайтов на моем сайте, поэтому для создания безопасных маршрутов я создаю следующую защиту:
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)]
Это возможно?
1 ответ
Это, вероятно, создаст проблемы с 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 } }