@PostFilter和@PreFilter如何工作

Zac*_*ack 10 java spring annotations spring-security spring-annotations

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

@PostFilter("hasPermission(filterObject, 'READ') or hasRole('ROLE_ADMIN')")

    public List<User> getUsers(String orderByInsertionDate,
            Integer numberDaysToLookBack) throws AppException
Run Code Online (Sandbox Code Playgroud)

;

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

vto*_*tor 16

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

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

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

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

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

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

@PostFilter ("filterObject.owner == authentication.name")
Run Code Online (Sandbox Code Playgroud)

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