Java @PostFilter和@PreFilter如何工作
作为spring注释的新手,我需要对以下代码进行澄清Java @PostFilter和@PreFilter如何工作,java,spring,spring-security,annotations,spring-annotations,Java,Spring,Spring Security,Annotations,Spring Annotations,作为spring注释的新手,我需要对以下代码进行澄清 @PostFilter("hasPermission(filterObject, 'READ') or hasRole('ROLE_ADMIN')") public List<User> getUsers(String orderByInsertionDate, Integer numberDaysToLookBack) throws AppException @PostFilter(“hasP
@PostFilter("hasPermission(filterObject, 'READ') or hasRole('ROLE_ADMIN')")
public List<User> getUsers(String orderByInsertionDate,
Integer numberDaysToLookBack) throws AppException
@PostFilter(“hasPermission(filterObject,'READ')或hasRole('ROLE_ADMIN'))
公共列表getUsers(字符串orderByInsertionDate,
整数numberDaysToLookBack)抛出AppException
)
因此,这意味着getUsers返回的用户列表将只包含那些对调用对象具有完全
“READ”
访问权限的元素,或者调用对象的角色为“role\u ADMIN”
。谢谢。@PreFilter
和@PostFilter
指定与Spring security一起使用,以便能够根据授权筛选集合或数组
要使其正常工作,您需要在SpringSecurity中使用基于表达式的访问控制(如示例中所示)
@PreFilter-在执行方法之前过滤集合或数组
@PostFilter-在执行方法后过滤返回的集合或数组
因此,假设您的getUser()
返回用户列表。Spring Security将遍历列表并删除应用表达式为false的所有元素(例如,不是admin,并且没有读取权限)
filterObject是在其上执行筛选操作的内置对象,您可以对该对象应用各种条件(这里基本上所有内置表达式都可用,例如,主体
,身份验证
),例如您可以
@PostFilter ("filterObject.owner == authentication.name")
虽然这些过滤器很有用,但对于大型数据集来说,它的效率确实很低,而且基本上您对结果失去了控制,而Spring控制了结果 由于当前接受的答案没有进入@PreFilter,这是我的两分钱: (引自 用于指定方法筛选表达式的注释,该表达式将在调用方法之前进行计算使用filterTarget属性指定要筛选的参数的名称。这必须是支持remove方法的Java集合实现
@PreFilter对方法参数而不是返回值进行操作。如果带注释的方法只有一个集合参数,则可以省略filterTarget注释参数。其他答案非常清楚
@PreFilter
和@PostFilter
的原理和效果
我只是觉得有必要添加一个关于方法输出类型的信息-这两个注释都适用于集合、数组、流和映射。请小心将它们与例如可选的一起使用。虽然对我来说,过滤一个可选的(您认为它是最多包含一个元素的集合)是很自然的,但这将引发以下自spring security core 5.4.1以来的异常:
java.lang.IllegalArgumentException:筛选器目标必须是集合、数组、映射或流类型,但它是可选的[0]
很好的描述。帮助我过滤我的结果。ThankyouPostFilter在某种意义上是不言自明的,即Spring在从数据源获取结果后对其进行过滤。你能解释一下@Prefilter在获取数据之前是如何过滤的吗。@SaurabhTiwari,看到我的答案了吗