2013-01-31 3 views
25

私のコントローラメソッドで@PreAuthorizeで春のセキュリティを使用しています。私の推論では、認可チェックが1つの層で予測可能に、そして要求の中で可能な限り早く起こることを望んでいたということでした。しかし、私は春のセキュリティ3のドキュメントを読んで、サービスレベルでメソッドレベルのセキュリティを適用することを推奨しているのを見ました(しかし、なぜかは言いません)。コントローラレイヤまたはサービスレイヤでセキュリティメソッドレベルのアノテーションを適用する必要がありますか?

私の質問は、セキュリティメソッドレベルの注釈をコントローラレイヤーまたはサービスレイヤーに適用する必要がありますか? (または「両方」、または「それは依存していますか?」)さらに重要なのは、なぜですか?

答えて

13

「それは依存しています」。アプリケーションにすべてのビジネスロジックが適用されるサービスレイヤがある場合は、通常、セキュリティ制約を適用するためのきれいな場所であり、コーナーケースを逃していないことを確認してください。

ウェブコードは一般的に扱いにくいですが、それ以上のものがありますが、それはより迅速に変化し、複数の場所から同じサービスメソッドを呼び出すことになります。誰かが新しいコントローラーを追加し、正しくコントローラーを忘れてしまうかもしれません。あるいは、同じサービスを呼び出す異なるタイプのクライアントを持つこともできます。

しかし、アプリケーションの構造や使用状況によって異なります。なぜあなたはコントローラを保護したいのかについて、良い議論をしているかもしれません。

+0

ありがとうございました。サービスにセキュリティを置くための良い議論がありました。あなたはコントローラーを確保するための良い議論と考えていますか?またコンテキストについては、私の念頭に置いているアプリは、基本的にコントローラのエンドポイントごとのサービスメソッドを持っています。私のサービスはトランザクション境界を定義しているからです。したがって、同じサービスメソッドは1つの場所から呼び出され、そのサービスを使用する他のクライアントは存在しません。 – Jay

+0

私がサービスに権限を与えることを考えたもう一つの理由は、どのサービスにアクセスできるかという質問はビジネス上の決定であり、ビジネスロジックと位置づけることができるということです。 – Jay

+1

私の頭の上から離れて、私はサービス層に優先してコントローラを確保するための良い引数を持っていません。これは、特定のケースでは存在しない可能性があるわけではありません。要求には、通常、要求ヘッダーなどのWeb層でのみ利用可能なデータに基づいてルールを指定する場合があります。 –

9

コードの再利用について考えてみましょう。他の場所であなたのサービスを利用しようとしていますか?あなたのWeb層にフィードするだけではありませんか? サービス層を保護するため、サービスをjmsブリッジと再利用します。

+1

これは考慮すべきポイントです。ありがとうございます。この特定のケースでは、サービスはWeb層に給電するためにのみ使用されます。 – Jay

0

私はサービスがそれを使用するより良い場所だと思います。サービス注釈のこの種を入れて

Despites some problems@PreAuthorizeControllercould presentと春のセキュリティに関するFAQ recommendsことを、私はいくつかのアクションの許可はその後、Web層の責任より多くのビジネスルールであることを理解しています。

関連する問題