簡體   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