簡體   English   中英

Angular 4-CanActivate檢查組件正在路由

[英]Angular 4 - CanActivate check component being route

在CanActivate中,有一種方法可以檢查用戶正在路由/請求哪個組件以進行身份​​驗證。 因此,與其像我在下面所做的那樣檢查URL,不如做if(route.component instanceof MyComponent)之類的事情。

我正在實現基於角色的訪問,並具有將每個角色配置為對不同組件具有不同訪問級別(視圖,編輯等)的能力。 因此,我認為最簡單的方法是獲取當前組件的路由,然后檢查該組件的訪問級別,而不是為每個組件創建不同的AuthGard。

我試圖通過檢查URL來做到這一點,但是當URL中包含參數時它的大小寫問題。

 canActivate(route: ActivatedRouteSnapshot,
        state: RouterStateSnapshot) {       
            let ac = this.auth.getAccessConfig();
            switch (state.url) {
                case '/site':
                    return ac.some(x => x.moduleID == AccessModulesEnum.Site && x.permissionID == AccessPermissionEnum.View);
                case '/site/new':
                    return ac.some(x => x.moduleID == AccessModulesEnum.Site && x.permissionID == AccessPermissionEnum.Modify);
                case '/site/:id': ***//this doesn't work as :id could be anything***
                    return ac.some(x => x.moduleID == AccessModulesEnum.SiteDetail && x.permissionID == AccessPermissionEnum.View);
                case '/reports/milestone':
                    return ac.some(x => x.moduleID == AccessModulesEnum.MilestoneReport && x.permissionID == AccessPermissionEnum.View);
                case '/reports/audit':
                    return ac.some(x => x.moduleID == AccessModulesEnum.AuditReport && x.permissionID == AccessPermissionEnum.View);
                case '/reports/schedule':
                    return ac.some(x => x.moduleID == AccessModulesEnum.ReportScheduler && x.permissionID == AccessPermissionEnum.View);
                case '/importer':
                    return ac.some(x => x.moduleID == AccessModulesEnum.Import && x.permissionID == AccessPermissionEnum.View);
                case '/reports':
                    return ac.some(x => x.moduleID == AccessModulesEnum.SiteReport && x.permissionID == AccessPermissionEnum.View);
                case '/admin/users':
                    return ac.some(x => x.moduleID == AccessModulesEnum.User && x.permissionID == AccessPermissionEnum.View);
                case '/admin/tables':
                    return ac.some(x => x.moduleID == AccessModulesEnum.ReferenceTable && x.permissionID == AccessPermissionEnum.View);
                default:
                    return false;
            }
        });
    }

另一個問題:是否可以使用來自Routes配置的參數調用AuthGard,例如{path:'site /:id',component:SiteDetail,canActivate:[(callCustomeAuthGard('SiteDetailComponent')]

謝謝

已使用route.routeConfig.path而不是url(類似於“ site /:id”而不是“ site / 2”)來檢查路由路徑,從而找到了解決上述問題的解決方案。

但是,是否希望有更好的方法來進行如上所述的基於角色的身份驗證。

您是否嘗試過route.component 根據docs ,其中應包含要路由到的組件類。

如果是這樣,則激活保護人員可以詢問組件類它需要哪些權限。

您的ActivatedRouteSnapshot(在canActivate函數中使用的route參數)包含該組件。

因此,您可以使用:

if (route.component === MyComponent) {
  // Do something
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM