@PostFilter和@PreFilter如何工作

作为spring注释的新手,我需要澄清下面的代码。

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

;

所以这意味着getUsers返回的用户列表将只包含对调用对象具有完全"READ"访问权限的元素,或者调用对象具有"ROLE_ADMIN"角色。 谢谢。

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

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

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

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

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

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

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

虽然这些filter很有用,但对于大型数据集来说效率非常低,而且基本上你失去了对结果的控制,而Spring控制着结果。