【问题标题】:Angular2, factory guard is possible?Angular2,工厂守卫可以吗?
【发布时间】:2018-02-06 11:35:04
【问题描述】:

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

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)]

这可能吗?

【问题讨论】:

    标签: javascript angular angular2-routing angular2-services angular-guards


    【解决方案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 } }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 2011-01-17
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      相关资源
      最近更新 更多