我有一个类似的用例,管理员可能想要创建新角色,并为这些角色任意分配权限。
如果我要授权用户在他们授予的权限中存在ROLE_*,那么每次有人添加新角色或该角色的业务需求发生变化时,代码都需要更改。
与@Ralph 一样,我创建了一个库来基于Role to Permissions 注入映射权限,因为我发现缺少分层角色实现...
在当前安全会话中注入身份验证对象时,它将具有原始角色/授予权限。
例如,您可以在 UserDetailsService 或 JWT Authentication Converter 中提供映射权限。
调用 PermissionProvider 以获取用户所属的每个角色的有效权限。不同的权限列表作为 GrantedAuthority 项添加到 Authentication 对象中。
然后我可以在配置中使用权限级别授权,并且角色到权限映射可以在运行时更改。
概念 -
ADMIN1 -> PERM_ADD, PERM_POST
ADMIN2 -> PERM_POST, PERM_UPDATE
实现示例 -
@Autowired
RolePermissionsRepository repository;
public void setup1(){
String roleName = "ROLE_ADMIN1";
List<String> permissions = new ArrayList<String>();
permissions.add("PERM_ADD");
permissions.add("PERM_POST");
repository.save(new RolePermissions(roleName, permissions));
}
public void setup2(){
String roleName = "ROLE_ADMIN2";
List<String> permissions = new ArrayList<String>();
permissions.add("PERM_UPDATE");
permissions.add("PERM_POST");
repository.save(new RolePermissions(roleName, permissions));
}
然后使用权限而不是角色进行访问。
<http auto-config="true">
<intercept-url pattern="/addData" access="PERM_ADD" />
<intercept-url pattern="/updateData" access="PERM_UPDATE" />
<intercept-url pattern="/postMessage" access="PERM_POST" />
</http>
或者使用授权注解——
@PreAuthorize("hasAuthority('PERM_ADD')")
@RequestMapping("/add")
public String add() {
...
}
源代码见这里——
https://github.com/savantly-net/spring-role-permissions