2016-04-23 247 views
0

我在我的項目中使用了spring security。我有一個服務如下:爲什麼@PostFilter有時在Spring Security服務中不起作用?

public interface A { 

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

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

實施method1()我用method2(),但PostFiltermethod2()不要在這種狀態下工作。

爲什麼

回答

1

你的觀察是正確的。

要處理安全註釋,Spring使用代理。代理是一個動態生成的類,放在調用者和實際實現之間。所以當你使用接口A時,你並不是直接調用你的實現,而是一個安全層。

默認情況下,Spring使用接口代理;代理實現了有問題的接口。這意味着僅當您使用A 作爲接口時纔會調用安全性。當從實現類本身調用某個方法時,安全性不會被執行,因爲實現不知道代理。

通過使用類代理,當一個方法是從類本身調用的安全註解可以正常工作,因爲那時代理延伸實施。但是,仍然只有關於公共方法的註釋纔有效。

有關代理的更深入的解釋,請參見Spring框架手冊中的Proxying mechanisms

相關問題