繁体   English   中英

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: [TrustGuard]

问题是我有太多的信任,因此我需要为每个信任建立一个守卫。 因此,我正在努力建立一个警卫工厂,以避免实施太多类似的警卫。

我的目标是找到像canActivate: [FactoryTrustGuard(Trust.seeDashboard)]一样设置路线的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 } }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM