@PostFilter和@PreFilter如何在Spring Security中工作?

作为Spring安全注释的新手,我需要对下面的代码进行澄清。

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

因此,这意味着 getUsers 返回的用户列表将仅包含那些对调用对象具有完全访问权限或调用对象具有角色为 .谢谢。"READ""ROLE_ADMIN"


答案 1

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

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

@PreFilter - 在执行方法之前筛选集合或数组。

@PostFilter - 在执行方法后筛选返回的集合或数组。

因此,假设您的退货用户列表。Spring Security将循环访问列表并删除应用表达式为假的任何元素(例如,不是管理员,也没有读取权限)getUser()

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

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

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


答案 2

由于目前接受的答案没有进入@PreFilter,这是我的两分钱:

(引自 JavaDocs)

用于指定方法筛选表达式的批注,该表达式将在调用方法之前进行计算。要筛选的参数的名称是使用 filterTarget 属性指定的。这必须是支持 remove 方法的 Java 集合实现。

@PreFilter对方法参数(而不是返回值)进行操作。如果带批注的方法只有一个集合参数,则可以省略 filterTarget 批注参数。


推荐