我对我的网站有很多信任,所以为了建立安全的路由,我建立了下一个守卫:

export class TrustGuard implements CanActivate {
    constructor(private router: Router) {
    }

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
        return /*Check if user has the trust or not*/;
    }
}

所以,在 route ,我可以添加像 canActivate: [TrustGuard] 这样的守卫

问题是我有太多的信任,因此我需要为每个信任建立一个守卫。所以我试图建立一个 guard 工厂,以避免实现太多类似的 guard 。

我的目标是找到设置路线的方式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;
}

如果有几十个类似的guard,可以做成单个guard,通过路由数据传递一个 Angular 色:
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 } }

关于javascript - Angular2,工厂守卫可能吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48642134/

10-11 10:58