4

我有一個運行在Tomcat 7上的java web應用程序。 我在後端使用Spring 3.2和Spring Security 3.1,通過/ api/**模式後的RESTful URL暴露API。使用Spring Security 3.1通過表單登錄和http基本安全保護相同的RESTful資源

Web應用程序的UI使用BackboneJS構建。我正在使用直接映射到RESTful URL的Backbone模型。

使用表單登錄身份驗證鎖定用戶界面,因此,如果用戶當前未通過身份驗證,則用戶總是會重定向到登錄屏幕。

我現在試圖使用http-basic認證將相同的RESTful URL公開給另一個外部服務。不幸的是,當保護相同的URL模式時,Spring似乎不允許我使用多個過濾器鏈。無論在配置文件中首先定義哪個優先。

我不願意爲相同的RESTful資源映射到單獨的URL模式,但似乎我可能沒有選擇。

這裏是我的(目前破碎)春季安全配置的重要樣本:

<!-- 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> 

我的問題是: 是否可以配置兩個不同類型的安全性(HTTP基本和表單登錄)使用Spring Security的相同的URL模式?這種情況是否有最佳做法?

謝謝。

+0

當未經身份驗證的用戶嘗試請求其中某個資源時,您希望優先考慮哪一個?使用基於表單的身份驗證,您將獲得302重定向到登錄頁面,使用基本身份驗證您會遇到401挑戰。除非您堅持認爲基本身份驗證客戶端必須預先包含授權標頭,而不是等待受到挑戰,否則我沒有看到如何在相同的URL上正確支持兩者。 – 2013-02-27 09:36:07

+0

@IanRoberts這似乎是保護相同URL的主要問題。理想情況下,我希望安全服務足夠聰明,可以根據請求頭部進行選擇。現在,我傾向於使用單獨的URL來處理源自UI和外部服務的請求。這似乎是最簡單的方法。 – 2013-02-27 14:30:19

回答

1

你爲什麼不只是合併兩個<http>內容是這樣的:

<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> 

這將建立一個既與UsernamePasswordAuthenticationFilter在同一個過濾器鏈可能服務於用戶界面客戶端BasicAuthenticationFilter和外部服務也是如此。

0

嘗試通過圖案來代替圖案=「/ 」 =「/ API/」在API配置:

<http pattern="/api/**" create-session="stateless"> 
    <intercept-url pattern="/api/**" access="ROLE_USER"/> 
    <http-basic/> 
</http> 
+0

不幸的是,這仍然導致伊恩在上面的評論中提到的同樣的問題。如果用戶未通過身份驗證,則返回哪個狀態碼?對於http基本,你會得到一個401,而不是登錄頁面重定向到form-login。 – 2013-02-27 14:31:39

1

不可能開箱應用2種不同的過濾器鏈對於單個URL模式。

但是,建議您將獨特的URL模式作爲UI和API使用,因爲您將來必須應用完全不同的過濾器鏈。

例如,SecurityContextRepository保存會話信息併爲每個請求檢索。您不希望通過基本身份驗證將其應用於UI和API訪問

相關問題