在 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')]
谢谢