为什么@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。
我在我的项目中使用 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。