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 } }
Другие вопросы по тегам