2013-02-12 18 views
6

私は次のロジックを持っている私のセキュリティを必要とする:カスタム春3.0セキュリティ・フィルタ、複数のエントリポイント、AuthenticationProvider

  1. paremeterの存在に応じて、ヘッダパラメータ
  2. の存在を確認し、リダイレクトのいずれかを実行します(認証されていない場合)、または基本認証トークンを確認する

どちらの場合も、私は同じ認証プロバイダを持っていますが、動作させることはできません。 委任エントリポイントが正常に動作しますが、私は私のカスタムauthenticationproviderに入ることはありません...ここで

は私のセキュリティの設定です:

<security:global-method-security 
    secured-annotations="enabled" /> 

<security:http entry-point-ref="delegatingAuthenticationEntryPoint" 
    use-expressions="true" auto-config="false"> 
    <!-- <security:custom-filter position="FORM_LOGIN_FILTER" --> 
    <!-- ref="usernamePasswordAuthenticationFilter" /> --> 
    <!-- <security:custom-filter position="BASIC_AUTH_FILTER" --> 
    <!-- ref="basicAuthenticationFilter" /> --> 
    <security:intercept-url pattern="/login*" 
     filters="none" /> 
    <security:intercept-url pattern="/portimaLogin*" 
     filters="none" /> 
    <security:intercept-url pattern="/**" 
     access="isAuthenticated()" /> 
</security:http> 

<bean id="delegatingAuthenticationEntryPoint" 
    class="org.springframework.security.web.authentication.DelegatingAuthenticationEntryPoint"> 
    <constructor-arg> 
     <map> 
      <entry key="hasHeader('portima','true')" value-ref="PortimaLoginUrlAuthenticationEntryPoint" /> 
     </map> 
    </constructor-arg> 
    <property name="defaultEntryPoint" ref="authenticationEntryPoint" /> 
</bean> 

<bean id="usernamePasswordAuthenticationFilter" 
    class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationFailureHandler" ref="authenticationFailureHandler" /> 
</bean> 

<bean id="basicAuthenticationFilter" 
    class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationEntryPoint" ref="authenticationEntryPoint" /> 
</bean> 

<bean id="PortimaLoginUrlAuthenticationEntryPoint" 
    class="be.ap.common.security.spring.PortimaLoginUrlAuthenticationEntryPoint"> 
    <property name="loginFormUrl" value="${portima.login.page}" /> 
</bean> 

<bean id="authenticationEntryPoint" 
    class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint"> 
    <property name="realmName" value="AP" /> 
</bean> 

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider 
     ref="authenticationProvider" /> 
</security:authentication-manager> 

<bean id="authenticationProvider" class="be.ap.common.security.spring.APAuthenticationProvider" /> 

<bean id="userDetailsService" class="be.ap.common.security.spring.APUserDetailsService" /> 

任意のアイデア?

+0

カスタムAuthenticationProviderは 'supports()'メソッドを正しく実装していますか? 'UsernamePasswordAuthenticationToken'クラスに対してfalseを返すと、フィルタによって作成された認証トークンを処理するよう要求されることはありません。 – zagyi

+0

サポートメソッドにも入っていません... –

+0

@Override public boolean supports(クラス<?extends Object>認証){ return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication); } –

答えて

12

私はついにそれを働かせました。あなたが見ることができるように

<security:http entry-point-ref="delegatingAuthenticationEntryPoint" 
    use-expressions="true"> 
    <security:custom-filter position="PRE_AUTH_FILTER" 
     ref="preAuthenticationFilter" /> 
    <security:custom-filter position="FORM_LOGIN_FILTER" 
     ref="usernamePasswordAuthenticationFilter" /> 
    <security:custom-filter position="BASIC_AUTH_FILTER" 
     ref="basicAuthenticationFilter" /> 
    <security:intercept-url pattern="/login*" 
     filters="none" /> 
    <security:intercept-url pattern="/portimaLogin*" 
     filters="none" /> 
    <security:intercept-url pattern="/accessDenied*" 
     filters="none" /> 
    <security:intercept-url pattern="/**" 
     access="isAuthenticated()" /> 
    <security:access-denied-handler ref="accessDeniedHandler" /> 
</security:http> 

<!-- Spring Security Custom Filters --> 

<bean id="usernamePasswordAuthenticationFilter" 
    class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationFailureHandler" ref="authenticationFailureHandler" /> 
</bean> 

<bean id="basicAuthenticationFilter" 
    class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationEntryPoint" ref="authenticationEntryPoint" /> 
</bean> 

<bean id="preAuthenticationFilter" class="be.ap.common.security.spring.APPreAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
</bean> 

<!-- Spring Security Custom EntryPoint --> 

<bean id="delegatingAuthenticationEntryPoint" 
    class="org.springframework.security.web.authentication.DelegatingAuthenticationEntryPoint"> 
    <constructor-arg> 
     <map> 
      <entry key="hasHeader('portima','true')" value-ref="PortimaLoginUrlAuthenticationEntryPoint" /> 
     </map> 
    </constructor-arg> 
    <property name="defaultEntryPoint" ref="authenticationEntryPoint" /> 
</bean> 

<bean id="PortimaLoginUrlAuthenticationEntryPoint" 
    class="be.ap.common.security.spring.PortimaLoginUrlAuthenticationEntryPoint"> 
    <property name="loginFormUrl" value="${portima.login.page}" /> 
</bean> 

<bean id="authenticationEntryPoint" 
    class="be.ap.common.security.spring.APBasicAuthenticationEntryPoint"> 
    <property name="realmName" value="AP" /> 
</bean> 
<bean id="accessDeniedHandler" 
    class="org.springframework.security.web.access.AccessDeniedHandlerImpl"> 
    <property name="errorPage" value="/accessDenied" /> 
</bean> 

<bean id="authenticationFailureHandler" 
    class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler"> 
    <property name="exceptionMappings"> 
     <props> 
      <prop 
       key="org.springframework.security.authentication.BadCredentialsException"> 
       /accessDenied 
      </prop> 
      <prop 
       key="org.springframework.security.authentication.CredentialsExpiredException"> 
       /accessDenied 
      </prop> 
      <prop key="org.springframework.security.authentication.LockedException"> 
       /accessDenied 
      </prop> 
      <prop 
       key="org.springframework.security.authentication.DisabledException"> 
       /accessDenied 
      </prop> 
     </props> 
    </property> 
</bean> 

<!-- Spring Security Authentication Manager --> 

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider 
     ref="authenticationProvider" /> 
</security:authentication-manager> 

<bean id="authenticationProvider" class="be.ap.common.security.spring.APAuthenticationProvider" /> 

<bean id="userDetailsService" class="be.ap.common.security.spring.APUserDetailsService" /> 

<!-- for Mock --> 
<bean id="SSOService" class="be.ap.security.service.SSOServiceMockImpl" /> 

は、私はあまりにもいくつかのことを追加しました:

は、ここに私のコンテキストファイルです。

私はauto-config属性を修正し、フィルタのコメントを外し、正しく定義しました。それが何をするかを簡単に理解を望んでいる他の人のために

は、ここに流れている:

  1. PRE_AUTH_FILTERが(すでにSSOに認証された場合)認証オブジェクトを事前入力するためのサービスのようなSSOをチェックします
  2. delegatingAuthenticationEntryPointその後、リクエストヘッダに応じて、認証方法を選択します
  3. 2つの方法があります。
    • カスタムLoginUrlAuthenticationEntryPoint
    • カスタムBasicAuthenticationEntryPoint

PREAUTHは私のSSOサービスを利用する際にBasicAuthとLoginURLAuthが同じAuthenticationProviderを使用しています。

他人に役立つことを願っています!

関連する問題