[英]User login with permissions to routes with angular and spring boot
[英]Access Routes based on user dynamic permissions in Angular 6 or later
我已经对登录的用户应用了基于角色的授权。JWT 令牌存储在 localStorage 中,并且路由基于 Login 和 auth.guard.ts 获得访问权限。
但除此之外,某些用户还需要访问某些具有相同角色的其他用户不需要的组件。 json 数组定义了用户即使在登录后也可以访问哪些路由。
我为完成这项工作而定义的是检查组件的ngOnInit
。 如果该组件存在于数组中,则应该允许它访问其他必须显示的 404 页面。
但似乎我没有发现这种方法是一种有效的方法。
请建议我可以用插图做的任何即兴创作。 想做的每一件事都做对了。
您可以对特定路由进行角色验证:
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
function 中:
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;
}
}
可以使用 object 之类的路由而不是数组,并且只匹配实际的错误匹配。
user.routePermissions = {
'route1': false
}
这将使维护更容易,因为您无需更新所有用户以添加新路线。
我建议你使用ngx-permissions ,检查这个。 它非常适合根据模板或路由中的角色授予访问权限,您可以在身份验证后立即为每个用户加载权限
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 {}
您需要根据用户基于角色的授权创建不同的不同模块,并且每个模块都有一个基本路由文件,您需要检查该模块是否根据用户授权在路由中使用 AuthGuard。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.