为什么@PostFilter 在 Spring 安全服务中有时不起作用?

Why @PostFilter don't work sometimes in Spring Security service?

我在我的项目中使用 spring 安全性。我有如下服务:

public interface A {

   @PostFilter("hasPermission(filterObject, 'read')")
   List<MyEntity> method1();

   @PostFilter("hasPermission(filterObject, 'read')")
   List<MyEntity> method2();
}

在实现method1()中我使用method2(),但是method2()中的PostFilter在这种状态下不工作。

为什么

你的观察是正确的。

为了处理安全注释,Spring 使用 代理 。代理是动态生成的 class ,它位于调用者和实际实现之间。因此,当您使用接口 A 时,您实际上并没有直接调用您的实现,而是一个安全层。

默认情况下Spring使用接口代理;代理 实现 有问题的接口。这意味着仅当您将 A 用作接口 时才会调用安全性。当从实现 class 本身调用方法时,不会强制执行安全性,因为实现不知道代理。

通过使用 class 代理,当从 class 本身调用方法时,安全注释可以工作,因为代理 扩展 实现。但是,仍然只有 public 方法上的注释有效。

有关代理的更深入解释,请参阅 Spring 框架手册中的 Proxying mechanisms