我已对登录的用户应用了基于角色的授权。JWT 令牌存储在 localStorage 中,并根据 Login 和 auth.guard.ts 路由获取访问权限。
但除此之外,某些用户还需要访问某些具有相同角色的其他用户不需要的组件。
JSON
数组定义用户即使在登录后也可以访问哪些路由。
为了完成此任务,我定义的是检查组件的
ngOnInit
。如果该组件存在于数组中,则应允许它访问其他必须显示的404 page
。
但似乎我没有发现这种方法是一种有效的方法。
请提出我可以用插图进行的任何即兴创作。愿意以正确的方式做每件事。
您可以对特定路线进行角色验证:
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
}
这将使维护变得更容易,因为您不需要为添加的新路线更新所有用户。
我建议您使用
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 {}
您需要根据用户的基于角色的授权创建不同的模块 每个 Molude 都有一个基本路由文件,您需要在路由中使用 AuthGuard 检查该模块是否根据用户授权。