2012-02-15 12 views
7

私はすでにフォームログインと基本認証をDelegatingAuthenticationEntryPointの助けを借りて並べて処理しています。フォームとHTTPベーシック認証の両方を異なるソースで処理する

私がしようとしているのは、ユーザーがログインフォームを使用して条件 "A"に対して認証され、ユーザーが基準 "B"に対して認証される基本認証要求を送信するようにさせることです。

アプリケーションのリソースの一部は、RESTfulなサービス(Basic auth経由でアクセス可能)によって公開されています。ユーザーはRESTサービスコールを行うために独自の資格情報を入力する代わりに、後でユーザーまたはアプリケーション管理者が取り消すことができるRESTサービス専用に生成されたキーと値のペアを入力できます。

2つの認証方法の間で、できるだけ多くのセキュリティ固有のBeanを共有することをお勧めします。私は別のUserDetailsServiceフォームが私のusersテーブルを照会するので、基本認証が私のservice_credentialsテーブルに照会する必要があることを知っています。

Spring Securityでこの種の設定を行う正しい方法は何ですか?

答えて

13

あなたのアプリケーションに応じて、あなたは春のセキュリティ3.1を使用しているかどうか、あなたは、複数のフィルタチェーンに定義された別々の認証マネージャで各設定を分割するのが最善かもしれません:

<http pattern="/rest_api/**" create-session="stateless" 
    authentication-manager-ref="serviceCredsAuthMgr"> 
    <http-basic /> 
</http> 

<http authentication-manager-ref="mainAuthMgr"> 
    <form-login /> 
</http> 

<authentication-manager id="serviceCredsAuthMgr"> 
    <authentication-provider user-service-ref="serviceCredsUserDetailsSvc" /> 
</authentication-manager> 

<authentication-manager id="mainAuthMgr"> 
    <!-- whatever --> 
</authentication-manager> 

代わりのpatternをアトリビュート​​を使用して、着信要求を特定のフィルタチェーンにマッピングするために使用されるRequestMatcherインスタンスを指定することもできます。これは非常にシンプルなインターフェースですが、Acceptヘッダーなど、URLパス以外のものに基づいて一致させることができます。 SpringSecurity(3.2.3.RELEASE)で

+0

素晴らしいです!私のDelegatingAuthenticationEntryPointはいくつかのRequestMatchersを使用します。 –

1

は基本認証だけでなく、細かいフォームを働く:

<http pattern="/resources/**" security="none"/> 
<http pattern="/webjars/**" security="none"/> 

<http pattern="/rest/**" create-session="stateless" use-expressions="true"> 
    <intercept-url pattern="/**" access="isFullyAuthenticated()"/> 
    <http-basic /> 
</http> 

<http auto-config="true" use-expressions="true"> 
    <http-basic/> 
    <intercept-url pattern="/login" access="permitAll"/> 
    <intercept-url pattern="/loginfailed" access="permitAll"/> 
    <intercept-url pattern="/logout" access="permitAll"/> 

    <intercept-url pattern="/admin**" access="hasRole('ROLE_ADMIN')"/> 
    <intercept-url pattern="/**" access="isAuthenticated()"/> 
    <form-login login-page="/login" default-target-url="/" authentication-failure-url="/loginfailed"/> 
    <logout logout-success-url="/logout"/> 
    <remember-me user-service-ref="userService"/> 
</http> 

<authentication-manager> 
    <authentication-provider user-service-ref="userService"> 
<!-- 
     <jdbc-user-service data-source-ref="dataSource" 
          users-by-username-query="SELECT email, password, enabled FROM users WHERE email = ?" 
          authorities-by-username-query=" 
             SELECT u.email, r.name FROM users u, roles r WHERE u.id = r.user_id and u.email = ?"/> 
--> 
<!-- 
     <user-service> 
      <user name="[email protected]" password="password" authorities="ROLE_USER"/> 
      <user name="[email protected]" password="admin" authorities="ROLE_ADMIN"/> 
     </user-service> 
--> 
    </authentication-provider> 
</authentication-manager> 
+1

この記事を新しいバージョンのspring secで再訪した人にこの情報を追加する時間をとって本当に感謝しています。 –

関連する問題