2016-04-23 8 views
0

私のプロジェクトでは春のセキュリティを使用しています。私はmethod2()を使用しますが、method2()PostFilterが、この状態では動作しない実装method1()なぜSpring Securityサービスで@PostFilterが動作しないのですか?

public interface A { 

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

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

:私は以下のようにサービスを提供しています。

なぜ

答えて

1

あなたの所見は正しいです。

セキュリティアノテーションを処理するために、Springはプロキシを使用します。プロキシは、呼び出し元と実際の実装の間に置かれる、動的に生成されるクラスです。したがって、インターフェイスAを使用すると、実際に実装を直接呼び出すのではなく、セキュリティレイヤを呼び出すことになります。

デフォルトでは、Springはインターフェイスプロキシを使用します。代理人は問題のインタフェースを実装しています。つまり、をインタフェースとして使用する場合にのみセキュリティが呼び出されます。実装はプロキシを知らないので、実装クラス自体からメソッドが呼び出されたときにセキュリティは強制されません。メソッドはクラス自体から呼び出されたとき、プロキシ実装を拡張するため

クラスプロキシを使用することによって、セキュリティアノテーションは、働くことができます。しかし、パブリックメソッドの注釈だけが機能します。

プロキシの詳細については、SpringフレームワークマニュアルのProxying mechanismsを参照してください。

関連する問題