基于角色的授权
Authorization based on roles
有没有办法使用库 angular-auth-oidc-client 轻松处理基于角色的授权?
只要有用户访问网站,我就想识别他们,所以我使用了 auto-login-all-routes
守卫,到目前为止一切正常。但我只想在 userData 包含特定角色时允许访问,否则重定向到未经授权的页面。
起初我虽然可以创建一个自定义版本的 auto-login-all-routes.guard.ts 但是由于使用的大部分服务都不是由模块导出的,所以它似乎不是一个好主意。
你有什么建议吗?
使用 2 个守卫。
第一个进行身份验证的人:
auto-login-all-routes.guard
然后自定义守卫监听oidcSecurityService.userData$
并检查角色。
这是我目前正在使用的示例,不确定它是否是您要找的。
路线
{
path: 'import',
component: ImportComponent,
canActivate: [AuthGuard, RoleGuard],
data: { roles: new Set([UserRole.admin, UserRole.developer]) },
},
后卫
@Injectable({
providedIn: 'root',
})
export class RoleGuard implements CanActivate {
constructor(private store: Store<AppState>, private location: Location) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.store.select(selectUserRoles).pipe(
debounce((roles) => (roles ? EMPTY : timer(2500))),
map((roles) => {
const permittedRoles = (route.data as RouteData).roles;
if (
roles &&
Array.from(roles.values()).some((role) => permittedRoles.has(role))
) {
return true;
} else {
alert(
`Requires one of the following roles: ${Array.from(permittedRoles)
.map((role) => getRoleName(role))
.join(', ')}`
);
this.location.back();
return false;
}
}),
first()
);
}
}
有没有办法使用库 angular-auth-oidc-client 轻松处理基于角色的授权?
只要有用户访问网站,我就想识别他们,所以我使用了 auto-login-all-routes
守卫,到目前为止一切正常。但我只想在 userData 包含特定角色时允许访问,否则重定向到未经授权的页面。
起初我虽然可以创建一个自定义版本的 auto-login-all-routes.guard.ts 但是由于使用的大部分服务都不是由模块导出的,所以它似乎不是一个好主意。
你有什么建议吗?
使用 2 个守卫。
第一个进行身份验证的人:
auto-login-all-routes.guard
然后自定义守卫监听oidcSecurityService.userData$
并检查角色。
这是我目前正在使用的示例,不确定它是否是您要找的。
路线
{
path: 'import',
component: ImportComponent,
canActivate: [AuthGuard, RoleGuard],
data: { roles: new Set([UserRole.admin, UserRole.developer]) },
},
后卫
@Injectable({
providedIn: 'root',
})
export class RoleGuard implements CanActivate {
constructor(private store: Store<AppState>, private location: Location) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.store.select(selectUserRoles).pipe(
debounce((roles) => (roles ? EMPTY : timer(2500))),
map((roles) => {
const permittedRoles = (route.data as RouteData).roles;
if (
roles &&
Array.from(roles.values()).some((role) => permittedRoles.has(role))
) {
return true;
} else {
alert(
`Requires one of the following roles: ${Array.from(permittedRoles)
.map((role) => getRoleName(role))
.join(', ')}`
);
this.location.back();
return false;
}
}),
first()
);
}
}