繁体   English   中英

@PostFilter 和 @PreFilter 如何在 Spring Security 中工作?

[英]How do @PostFilter and @PreFilter work in Spring Security?

作为 Spring 安全注释的新手,我需要对以下代码进行说明。

@PostFilter("hasPermission(filterObject, 'READ') or hasRole('ROLE_ADMIN')")
public List<User> getUsers(String orderByInsertionDate,
            Integer numberDaysToLookBack) throws AppException

因此,这意味着 getUsers 返回的用户列表将仅包含对调用对象具有完全"READ"访问权限或调用对象具有角色为"ROLE_ADMIN"那些元素。 谢谢。

@PreFilter@PostFilter被指定与 Spring 安全一起使用,以便能够根据授权过滤集合或数组。

要使其正常工作,您需要在 spring 安全性中使用基于表达式的访问控制(如您的示例中所示)

@PreFilter - 在执行方法之前过滤集合或数组。

@PostFilter - 执行方法后过滤返回的集合或数组。

因此,假设您的getUser()返回用户列表。 Spring Security 将遍历列表并删除任何应用表达式为 false 的元素(例如,不是管理员,并且没有读取权限)

filterObject 是执行过滤操作的内置对象,您可以对这个对象应用各种条件(基本上所有内置表达式都在这里可用,例如principalauthentication ),例如您可以这样做

@PostFilter ("filterObject.owner == authentication.name")

尽管这些过滤器很有用,但对于大数据集来说确实效率低下,而且基本上你失去了对结果的控制,取而代之的是 Spring 控制结果。

由于当前接受的答案没有进入@PreFilter,这是我的两分钱:

(引用自JavaDocs

用于指定方法过滤表达式的注释,该表达式将在调用方法之前进行评估。 要过滤的参数的名称是使用 filterTarget属性指定的 这必须是支持 remove 方法的 Java 集合实现。

@PreFilter 操作方法参数,而不是返回值。 如果带注释的方法只有一个 Collection 参数,则可以省略 filterTarget 注释参数。

其他答案非常清楚@PreFilter@PostFilter的基本原理和效果。

我只是觉得有必要添加有关方法输出类型的信息——这两个注释都适用于集合、数组、流和映射 小心使用它们,例如Optional 虽然对我来说过滤一个Optional是很自然的(你认为它是最多包含一个元素的集合),但从 spring-security-core 5.4.1 开始,这将抛出以下异常:

java.lang.IllegalArgumentException: 过滤器目标必须是集合、数组、映射或流类型,但为 Optional[0]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM