@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是内置对象,在其上执行过滤操作,您可以对此对象应用各种条件(基本上所有内置表达式都可用,例如principal
, authentication
),例如,您可以执行
@PostFilter ("filterObject.owner == authentication.name")
虽然这些filter很有用,但对于大型数据集来说效率非常低,而且基本上你失去了对结果的控制,而Spring控制着结果。