我目前的理解是,spring没有区分角色和权威,唯一的区别是 ROLE_
角色名称的缩写。
我希望实现的是具有权限的角色。也就是说,如果我给一个用户角色admin,他将获得所有相关的特权(例如访问网站上的路由以更新页面的权限)
我当前的实现如下:我有一个自定义特权类,它与roles类有多对多关系,roles类与用户的类有多对多关系。当 public Collection<? extends GrantedAuthority> getAuthorities()
在调用userdetails之后,它迭代所有权限并获取。
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
for (Role role : this.roles) {
for (Privilege pri : role.getPrivileges()) {
SimpleGrantedAuthority auth = new SimpleGrantedAuthority(pri.getName());
if (!authorities.contains(auth)) {
authorities.add(auth);
}
}
}
return authorities;
}
我的问题是:有没有更好的方法(最好是SpringSecurity自带的)?
编辑:角色位于数据库中,以便动态插入新角色。当前权限太多,但可能会被删除以进行硬编码(在这个特定实现中,权限是动态的没有多大意义)
3条答案
按热度按时间zfycwa2u1#
您需要扩展WebSecurityConfigureAdapter以实现以下目标:
这就是如何使用Spring Security 限制/允许对不同端点/uri的访问。注意最后一行,它限制了以
/only/for/admin
对于除管理员以外的所有角色/权限。希望你有这个想法。一个完整的例子,看看这里和这里。mu0hgdu02#
你可以揭露
RoleHierarchy
bean来创建角色和权限之间的层次结构。此示例说明如果用户
ROLE_ADMIN
然后他们也有AUTHORITY_READ
以及AUTHORITY_WRITE
.如果用户有
ROLE_USER
然后他们也有AUTHORITY_READ
.可以使用换行符定义多个角色层次结构
\n
把他们分开。ltqd579y3#
最后我选择了这个方法:
它的最大优点是在每个端点请求时都会调用它,从而使其成为动态的(我可以添加/删除角色和权限,而用户无需注销/登录即可使其生效)
这也允许我相对容易地进行伸缩,因为它可以通过接口和/或脚本进行控制