4

Tomcat 7 で Java Web アプリケーションを実行しています。バックエンドで Spring Security 3.1 を使用して Spring 3.2 を使用しており、/api/** パターンに従って RESTful URL を介して API を公開しています。

Web アプリケーションの UI は、BackboneJS を使用して構築されています。RESTful URL に直接マップされたバックボーン モデルを使用しています。

UI はフォーム ログイン認証を使用してロックされているため、ユーザーが現在認証されていない場合、ユーザーは常にログイン画面にリダイレクトされます。

http-basic 認証を使用して、同じ RESTful URL を別の外部サービスに公開しようとしています。残念ながら、同じ URL パターンを保護する場合、Spring では複数のフィルター チェーンを使用できないようです。構成ファイルで最初に定義されている方が優先されるようです。

同じ RESTful リソースに対して個別の URL パターンにマップする必要はありませんが、選択の余地はないようです。

これは、私の(現在壊れている)Spring セキュリティ構成の重要なサンプルです。

<!--  configure basic http authentication -->
<http pattern="/api/**" create-session="stateless">
    <intercept-url pattern="/**" access="ROLE_USER"/>
    <http-basic/>
</http>

<!--  configure form-login authentication -->
<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/ui/login" access="permitAll" />
    <intercept-url pattern="/ui/logout" access="permitAll" />
    <intercept-url pattern="/ui/loginfailed" access="permitAll" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    <custom-filter ref="ajaxTimeoutRedirectFilter" after="EXCEPTION_TRANSLATION_FILTER" />
    <form-login login-page="/ui/login" default-target-url="/" authentication-failure-url="/ui/loginfailed" />
    <logout logout-success-url="/ui/logout" />
    <session-management invalid-session-url="/ui/login"/>
</http>

私の質問は 、Spring Security を使用して、同じ URL パターンに対して 2 つの異なるタイプのセキュリティ (http-basic と form-login) を構成することは可能ですか? このタイプのシナリオのベスト プラクティスはありますか?

ありがとうございました。

4

3 に答える 3

1

<http>次のように 2 つの要素をマージしてみませんか。

<http pattern="/api/**" use-expressions="true">
    <intercept-url pattern="/ui/login" access="permitAll" />
    <intercept-url pattern="/ui/logout" access="permitAll" />
    <intercept-url pattern="/ui/loginfailed" access="permitAll" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    <http-basic/>
    <custom-filter ref="ajaxTimeoutRedirectFilter" after="EXCEPTION_TRANSLATION_FILTER" />
    <form-login login-page="/ui/login" default-target-url="/" authentication-failure-url="/ui/loginfailed" />
    <logout logout-success-url="/ui/logout" />
    <session-management invalid-session-url="/ui/login"/>
</http>

これにより、UI クライアントと外部サービスにサービスを提供できる同じフィルター チェーンにaUsernamePasswordAuthenticationFilterと a の両方が設定されます。BasicAuthenticationFilter

于 2013-02-26T21:18:48.823 に答える
1

1 つの URL パターンに対して 2 つの異なるフィルター チェーンを適用することは、そのままではできません。

ただし、将来的にはまったく異なるフィルター チェーンを適用する必要があるため、UI および API として固有の URL パターンを使用することをお勧めします。

たとえば、SecurityContextRepository はセッション情報を保持し、リクエストごとに取得されます。基本認証を介した UI および API アクセスに同じことを適用したくない

于 2013-03-08T18:52:58.040 に答える
0

API 設定で pattern="/ " を pattern="/api/ "に置き換えてみてください:

<http pattern="/api/**" create-session="stateless">
    <intercept-url pattern="/api/**" access="ROLE_USER"/>
    <http-basic/>
</http>
于 2013-02-27T09:28:27.823 に答える