【问题标题】:How do @PostFilter and @PreFilter work in Spring Security?@PostFilter 和 @PreFilter 在 Spring Security 中如何工作?
【发布时间】:2015-04-23 06:00:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring spring-security annotations spring-annotations


    【解决方案1】:

    其他答案非常清楚@PreFilter@PostFilter 的原理和效果。

    我只是觉得有必要添加有关方法输出类型的信息 - 这两个注释都适用于集合、数组、流和映射。小心使用它们,例如Optional。虽然对我来说过滤 Optional 是很自然的(你认为它是最多包含一个元素的集合),但自 spring-security-core 5.4.1 以来这将引发以下异常:

    java.lang.IllegalArgumentException:过滤器目标必须是集合、数组、映射或流类型,但是是可选的[0]

    【讨论】:

      【解决方案2】:

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

      (引用自JavaDocs

      用于指定方法过滤表达式的注释,该表达式将在调用方法之前进行评估。 要过滤的参数的名称是使用 filterTarget 属性指定的。这必须是支持 remove 方法的 Java Collection 实现。

      @PreFilter 作用于方法参数,而不是返回值。如果注解的方法只有一个 Collection 参数,那么 filterTarget 注解参数可以省略。

      【讨论】:

        【解决方案3】:

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

        要使其正常工作,您需要在 spring security 中使用基于表达式的访问控制(就像您在示例中所做的那样)

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

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

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

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

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

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

        【讨论】:

        • 很好的描述。帮助我过滤我的结果。谢谢
        • PostFilter 几乎是不言自明的,因为 Spring 在从数据源获取结果后过滤结果。你能解释一下@Prefilter 在获取数据之前是如何过滤的吗?
        • @SaurabhTiwari,看看我的回答
        猜你喜欢
        • 2015-07-27
        • 2020-10-15
        • 1970-01-01
        • 1970-01-01
        • 2021-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-15
        相关资源
        最近更新 更多