2009-08-19 111 views

回答

6

你想要的是可能最終的結果,我已經跑成完全相同的問題,這裏是我的解決方案。

無論何時,在名稱空間中定義form-login時,它都會自動覆蓋通過名稱空間應用的任何其他認證過濾器。這是通過彈簧安全性中FilterChainOrder.java的過濾器鏈的順序來完成的,以瞭解如何將順序實際應用於每個過濾器。

爲了解決這個問題,從名稱空間中除去http-basic標籤,然後手動定義bean以處理基本認證,並將其順序置於AuthenticationProcessingFilter之前,因爲這是將處理表單登錄的spring安全篩選器。

BasicProcessingFilter彈簧提供了處理基本身份驗證是一個被動過濾器,這意味着如果憑據丟失,它將繼續沿着過濾器鏈,直到找到合適的過濾器來處理請求。

現在通過手動定義BasicProcessingFilter bean,我們可以設置它將出現在過濾器鏈中的順序。 下面是附加的XML聲明的一個例子,你需要在安全XML提供(春季安全< 3.X)

<bean id="basicProcessingFilter" class="org.springframework.security.ui.basicauth.BasicProcessingFilter"> 
    <property name="authenticationManager"><ref bean="authenticationManager"/></property> 
    <security:custom-filter before="AUTHENTICATION_PROCESSING_FILTER"/> 
    <property name="authenticationEntryPoint"><ref bean="authenticationEntryPoint"/></property> 
</bean> 

<bean id="authenticationEntryPoint" 
    class="org.springframework.security.ui.basicauth.BasicProcessingFilterEntryPoint"> 
       <property name="realmName" value="My Realm Here"/> 
</bean> 

另外請注意,如果你的AuthenticationManager引用未找到,你可以添加別名你的名字空間就像下面的名字空間。

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

最終的結果是基本過濾器將作爲無源濾波器被應用,並且如果它的所需的憑據缺少它會繼續向下濾波器鏈和表單登錄濾波器然後將處理它。

此方法的問題是,如果憑據輸入正確,則迴應是來自表單登錄篩選器的登錄頁面。

但是,這個問題似乎會在spring安全3.1版本中被修復,並且這個工作將不再需要。

10

response by @grimesjm是正確的。不過,如果你使用Spring 3.X,你必須在類名適應:

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

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

而且

<sec:http auto-config="true"> 
    ... your intercept-url here 

    <sec:custom-filter before="SECURITY_CONTEXT_FILTER" ref="basicProcessingFilter" /> 

    <sec:form-login ... /> 
    .... 
</sec:http> 

我不知道是否SECURITY_CONTEXT_FILTER之前放置過濾器是最好的選擇或不。

1

Spring Security 3.1現在是可能的。0

+1

這是正確的,這裏是一個鏈接,將擴大這個答案:http://stackoverflow.com/questions/3671861/two-realms-in-same-application-with-spring-security – 2011-03-17 05:58:57

+0

我認爲目標是REST API支持同一領域內的身份驗證。定義兩個領域就像定義兩個戰爭 - 它的工作原理,但並不理想。 – Eugen 2011-11-17 21:48:40