在 Angular 6 或更高版本中基于用户动态权限访问路由

问题描述 投票:0回答:3

我已对登录的用户应用了基于角色的授权。JWT 令牌存储在 localStorage 中,并根据 Login 和 auth.guard.ts 路由获取访问权限。

但除此之外,某些用户还需要访问某些具有相同角色的其他用户不需要的组件。

JSON
数组定义用户即使在登录后也可以访问哪些路由。

为了完成此任务,我定义的是检查组件的

ngOnInit
。如果该组件存在于数组中,则应允许它访问其他必须显示的
404 page

但似乎我没有发现这种方法是一种有效的方法。

请提出我可以用插图进行的任何即兴创作。愿意以正确的方式做每件事。

angular permissions routes authorization
3个回答
4
投票

您可以对特定路线进行角色验证:

const routes: Routes = [
    {   //todo route you want to add validation for
        path: 'route',
        component: Component,
        canActivate: [AuthGuard],
        data: { roles: ["Admin"] } //recommend you dont use string here.
    },
    { path: '**', redirectTo: '' }
];

然后只需将这些行添加到现有的

canActivate
功能中:

    let currentUser = User;
    if (route.data.roles && route.data.roles.indexOf(currentUser.role) === -1) {
        // role not authorised so redirect to home page
        this.router.navigate(['/']);
        return false;
    }

阅读文档此处

编辑:

我建议您使用角色路由,因为它更容易维护且更一致,但是您可以将类似的内容添加到您的

canActivate
函数中:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
     let stateName: string = state.url.replace("/", "");
     let currentUser = User;
     if (currentUser.routePermissions.includes(stateName)) {
         // route not authorised so redirect to home page
         this.router.navigate(['/']);
         return false;
     }
}

可以使用像这样的路由对象来代替数组,并且只匹配实际的错误匹配。

user.routePermissions = {
    'route1': false
}

这将使维护变得更容易,因为您不需要为添加的新路线更新所有用户。


2
投票

我建议您使用

ngx-permissions
,检查this。它可以完美地根据模板或路由中的角色授予访问权限,您可以在身份验证后立即为每个用户加载权限

this.permissionsService.loadPermissions(perm);

然后您可以在任何地方使用它们

canActivate
canLoad
来管理访问

 const appRoutes: Routes = [
 {
  path: 'lazy',
   data: {
    permissions: {
     except: 'ADDDMIN',
    }
  },
  canLoad: [NgxPermissionsGuard],
  loadChildren: 'app/lazy-module/lazy-module.module#LazyModule'
},
];

@NgModule({
 imports: [
  RouterModule.forRoot(appRoutes)
 ],
 exports: [
   RouterModule
 ],
 providers: [
  // CanDeactivateGuard
 ]
})
export class AppRoutingModule {}

0
投票

您需要根据用户的基于角色的授权创建不同的模块 每个 Molude 都有一个基本路由文件,您需要在路由中使用 AuthGuard 检查该模块是否根据用户授权。

© www.soinside.com 2019 - 2024. All rights reserved.