1

関連するが異なることを行う 2 つのメソッドを持つ @Controller があるとします。それらを同じ URL エンドポイントで公開したいが、セキュリティ コンテキストに応じて機能が異なります。これで、マップされた単一のリクエスト メソッドを作成し、クラス内のさまざまなユーティリティ関数にディスパッチできることがわかりましたが、Spring MVC が入ってくるものに基づいてディスパッチを処理するように配線できますか?

ストローマンの例として、ROLE_ADMIN と ROLE_USER の間でディスパッチするコードがありますが、私の実際の使用例はかなり複雑です。

@Controller
public class Controller {

    @RequestMapping("/api/thing")
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public String doAnAdministrativeThing() {
         ... (admin-priviledge stuff goes here)
    }

    @RequestMapping("/api/thing")
    @PreAuthorize("hasRole('ROLE_USER')")
    public String doADifferentThing() {
         ... (normal-priviledged stuff goes here)
    }

}

ウサギの穴をプリエンプトするには:

  1. いいえ、2 つの関数を別の URL に配置したり、別のパラメーターや「通常の」 @RequestMapping ビットを使用したりすることについて、選択肢がない可能性があります。

  2. セキュリティ コンテキストの違いは複雑ですが、@PreAuthorize 式内で処理できます。

  3. 実際には、ディスパッチする異なるコンテキストが 2 つ以上あります

4

2 に答える 2

2

これは、いくつかの拡張機能で動作します。Can Spring Security use @PreAuthorize on Spring controllers methods? に対する @andyの回答のGitHub mohchi / spring-security-request-mapping への参照を参照してください。

于 2013-02-08T21:53:49.693 に答える
2

これは機能しないと思います。グローバル メソッド セキュリティは MVC レイヤーとはまったく関係ありません。さらに、サービス層にのみメソッドセキュリティを使用することが公式に推奨されています

一般に、個々の Web コントローラーではなく、サービス レイヤーでメソッド セキュリティを適用することをお勧めします。

PS 一般に、Spring コントローラーで AOP を使用することを避け、AOP メソッドをルート コンテキストでのみ (サーブレット コンテキストではなく) 宣言しようとします。これは、プロキシー コントローラー インスタンスが混乱を招く動作につながる可能性があり、ユーザーに Spring AOP 固有の知識を強制するためです。 JDK プロキシと CGLIB プロキシの違い、アノテーションの処理方法など。

于 2013-02-07T20:03:52.473 に答える