Spring Security中有一些概念和实现,比如用来获得授权/控制访问权限的GrantedAuthority
接口。
我希望这是允许的操作,如createSubUsers或deleteAccounts,我会允许管理员(具有ROLE_ADMIN
角色)。
我对我在网上看到的教程/演示感到困惑。我试着将我读到的东西联系起来,但我认为我们可以互换对待这两者。
我看到hasRole
在使用GrantedAuthority
字符串?我在理解上肯定是做错了。在Spring Security中,这些概念是什么?
我如何存储用户的角色,独立于该角色的权限?
我还查看了身份验证提供者引用的DAO中使用的org.springframework.security.core.userdetails.UserDetails
接口,它使用了一个User
(注意最后一个GrantedAuthority):
public User(String username,
String password,
boolean enabled,
boolean accountNonExpired,
boolean credentialsNonExpired,
boolean accountNonLocked,
Collection<? extends GrantedAuthority> authorities)
或者,有没有其他方法来区分其他两个?或者它不被支持,我们必须自己制作?
发布于 2018-05-15 07:13:00
理解这些概念之间关系的另一种方法是将角色解释为权威的容器。
权限是针对特定操作的细粒度权限,有时还带有特定的数据范围或上下文。例如,读、写、管理可以表示对给定信息范围的各种级别的许可。
此外,权限在请求的处理流程中执行得很深,而角色在到达控制器之前通过请求过滤方式进行过滤。最佳实践规定了在业务层中通过Controller实现授权实施。
另一方面,角色是一组权限的粗粒度表示。ROLE_READER将只具有读取或查看权限,而ROLE_EDITOR将同时具有读取和写入权限。角色主要用于在请求处理的外围的第一次筛选,例如http。... .antMatcher(...).hasRole(ROLE_MANAGER)
在请求的处理流程中深入实施的授权允许更细粒度的权限应用。例如,用户可能对第一级资源具有读写权限,但仅具有对子资源的读写权限。拥有ROLE_READER会限制他编辑第一级资源的权限,因为他需要写权限才能编辑这个资源,但是@PreAuthorize拦截器可以阻止他编辑子资源的试探性权限。
杰克
发布于 2020-02-17 03:10:03
正如其他人所提到的,我认为角色是更细粒度权限的容器。
尽管我发现层级角色实现缺乏对这些细粒度权限的精细控制。
因此,我创建了一个库来管理这些关系,并在安全上下文中按照已授予的权限注入权限。
我可能在应用程序中有一组权限,比如创建、读取、更新、删除,然后与用户的角色相关联。
或更具体的权限,如READ_POST、READ_PUBLISHED_POST、CREATE_POST、PUBLISH_POST
这些权限是相对静态的,但角色与它们的关系可能是动态的。
示例:
@Autowired
RolePermissionsRepository repository;
public void setup(){
String roleName = "ROLE_ADMIN";
List<String> permissions = new ArrayList<String>();
permissions.add("CREATE");
permissions.add("READ");
permissions.add("UPDATE");
permissions.add("DELETE");
repository.save(new RolePermissions(roleName, permissions));
}
您可以创建API来管理这些权限与角色的关系。
我不想复制/粘贴另一个答案,所以这里有一个关于SO的更完整解释的链接。
https://stackoverflow.com/a/60251931/1308685
为了重用我的实现,我创建了一个repo。请随时贡献自己的力量!
https://stackoverflow.com/questions/19525380
复制相似问题