Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @PostFilter和@PreFilter如何工作_Java_Spring_Spring Security_Annotations_Spring Annotations - Fatal编程技术网

Java @PostFilter和@PreFilter如何工作

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

作为spring注释的新手,我需要对以下代码进行澄清

@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,看到我的答案了吗