首页 > 解决方案 > 在春季安全中实现每组授权的最佳方法

问题描述

我正在尝试根据用户在组中的角色为用户授权某些操作的最佳方法。
例如,彼得在 A 组中具有管理员角色,因此他可以踢 A 组中的成员和 B 组中的成员角色,因此他只能读取 B 组中的内容。
这就是用户组关系模型的样子
有没有比在 UserDetails 中加载组角色更好的方法来实现授权,如下所示:

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

标签: springspring-bootspring-security

解决方案


这是ABAC权限模型,其安全决策不仅取决于用户的信息,还取决于受保护资源的状态/属性。

就 spring security 而言,最好使用@PreAuthorize//实现@PostAuthorize@PostFilter它允许您使用 SpEL 表达式来声明性地定义安全逻辑,这是一个最终将评估为真/假的表达式。在 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
    }
}

对于指针,请查看


推荐阅读