0

すべてのメソッドが保護されるように、リポジトリ インターフェイスで @PreAuthorize アノテーションを使用して Spring-Data リポジトリを保護しようとしています (ほとんどのメソッドが継承されているため)。その結果、私のインターフェースに含まれるカスタム メソッドはすべて、Spring-Data インターフェースによって継承されたすべてのメソッドによってセキュリティを取得します。スーパーインターフェースを拡張する単純なコンポーネントインターフェースに同じことを適用すると、適切に機能します。これが Spring-Security の問題なのか Spring-Data の問題なのかはわかりません。これを理解するための助けをいただければ幸いです。動作中のサービス セットアップと動作していない Spring-Data リポジトリの単体テストの例は、http://forum.springsource.org/showthread.php?133083-Using-PreAuthorize-on-SpringData-repositories からダウンロードできます. 失敗した testSuperRepositoryWithUser は AccessDeniedException を取得する必要がありますが、@PreAuthorize アノテーションは JpaRepository インターフェースに適用されません。

4

2 に答える 2

1

デフォルトでは、Spring は JDK プロキシを使用して Bean をラップします。この場合、注釈はインターフェイス メソッドに対してのみ機能します。したがって、より強力なプロキシ (CGlib または AspectJ) が必要です。あなたのケースを「そのまま」修正できるかどうかはわかりません。CGlib を試すことができます:

<security:global-method-security ... proxy-target-class="true" />

AspectJ の場合:

<security:global-method-security ... mode="aspectj" />

どちらの場合も、追加のライブラリと追加の構成が必要になります。詳細については、 AOP プロキシを参照してください。

アーキテクチャの観点から、セキュリティ アノテーションの最適な場所はサービス メソッドです。次のケースを考えてみましょう: ServiceA.methodA() と ServiceB.methodB() があります。それらは RepositoryC.methodC() を使用します。クライアントは、methodA() と methodB() に対して異なるセキュリティ権限を必要としています。セキュリティ層がリポジトリに適用されている場合は不可能です。したがって、セキュリティ アノテーションをサービスに適用するだけで、まったく問題はありません。

于 2012-12-13T16:56:04.907 に答える