spring - 在 Spring Security 中实现每组授权的最佳方式

标签 spring spring-boot spring-security

我正在尝试找到最佳方法来根据用户在组中的角色授权他们执行某些操作。
例如,Peter 在 A 组中具有管理员角色,因此他可以踢 A 组中的成员,在 B 组中具有成员角色,因此他只能读取 B 组中的内容。
this is what model of user group relationship looks like .
有没有比在 UserDetails 中加载组角色更好的方法来实现授权,如下所示:

(for (GroupUser groupuser: user.getGroupUsers()) {
   authorities.add(new SimpleGrantedAuthority('Group_'+groupuser.getId().getGroupId()+'_'+groupuser.getRole()));} 

最佳答案

这是 ABAC权限模型,其安全决策不仅由用户的信息决定,而且还由 protected 资源的状态/属性决定。

在 spring security 方面,最好使用 @PreAuthorize/@PostAuthorize/@PostFilter 实现,它允许您使用 SpEL表达式以声明方式定义安全逻辑,它是一个最终计算结果为 true/false 的表达式。在 SpEL 中,您可以访问执行要应用安全性的用例的方法的输入参数和返回对象,甚至可以引用 spring bean 来调用其方法来进行评估。

例如,你可以这样做:

@PreAuthorize("@authzService.isAllowToKickMember(principal , #userToKick)")
public void kickMemeber(User userToKick){
    
}


@Service
public class AuthzService{

    public boolean isAllowToKickMember(User currentUser , User userToKick){
        //check if current user can kick a given user
    }
}

有关指针,请查看 this .

关于spring - 在 Spring Security 中实现每组授权的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62492003/

相关文章:

java - 需要 Spring Framework IllegalArgumentException 'dataSource' 或 'jdbcTemplate' JAVA

java - 将 Docker 和 docker compose 与 Spring Boot REST 应用程序结合使用

java - Gitlab 管道上的测试容器 "JedisConnectionException: Could not get a resource from the pool"

java - @EnableWebSecurity 和 @EnableWebMvcSecurity 有什么区别?

spring-boot - Spring 安全 OAuth2 : how to add multiple Security Filter Chain of type ResourceServerConfigurer?

java - Spring MVC + Spring Security - 使用 JSON 的 Controller 身份验证

java - UserDetails.equals() 未调用

java - Thymeleaf 模板无法评估与模型相关的表达式

java - 如何测试仅调用存储库(dao)层的CRUD服务?

spring-boot - 找不到类路径资源