Angular 4 - CanActivate检查组件是路由

时间:2017-12-20 00:43:23

标签: angular angular-ui-router angular2-routing canactivate

在CanActivate中,有一种方法可以检查用户路由/请求哪个组件以进行身份​​验证。因此,我不想像下面那样检查网址,而是想做像if(route.component instanceof MyComponent)这样的事情。

我正在实现基于角色的访问,能够将每个角色配置为具有不同组件的不同访问级别(查看,编辑等等)。所以我认为最简单的方法是让当前组件成为路由,然后检查该组件的访问级别,而不是为每个组件创建不同的AuthGard。

我正在尝试通过检查网址来执行此操作,但在网址中包含参数时会出现套管问题。

 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;
            }
        });
    }

另一个问题:是否可以使用路径配置中的参数调用AuthGard,例如{path:' site /:id',component:SiteDetail,canActivate:[(callCustomeAuthGard)' SiteDetailComponent&#39 )]

由于

3 个答案:

答案 0 :(得分:0)

使用 route.routeConfig.path 找到上述问题的解决方案来检查路径路径而不是url,它将类似于'site /:id'而不是'site / 2'。< / p>

但是如果有更好的方法可以进行如上所述的角色基础身份验证。

答案 1 :(得分:0)

你试过route.component吗? According to the docs,这应该包含路由到的组件类。

如果是这样,激活防护可以向组件类询问它需要哪些权限。

答案 2 :(得分:0)

您的ActivatedRouteSnapshot(您在canActivate函数中使用的route参数)包含该组件。

因此您可以使用:

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