簡體   English   中英

使用Spring Security 3.1通過表單登錄和HTTP基本安全性來保護相同的RESTful資源

[英]Using Spring Security 3.1 to secure the same RESTful resources with both form-login and http-basic security

我有一個在Tomcat 7上運行的Java Web應用程序。我在后端使用Spring 3.2和Spring Security 3.1,並按照/ api / **模式通過RESTful URL公開API。

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

UI使用表單登錄身份驗證鎖定,因此,如果用戶當前未經過身份驗證,則始終將其重定向到登錄屏幕。

我現在正嘗試使用HTTP基本身份驗證將相同的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模式配置兩種不同類型的安全性(http-basic和form-login)? 是否有針對此類情況的最佳實踐?

謝謝。

您為什么不像這樣合並兩個<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>

這將在同一過濾器鏈中同時設置UsernamePasswordAuthenticationFilterBasicAuthenticationFilter ,可以為ui客戶端和外部服務提供服務。

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

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

例如,SecurityContextRepository保留會話信息,並針對每個請求進行檢索。 您不想通過基本身份驗證將相同的內容應用於UI和API訪問

嘗試在API配置中將pattern =“ / 替換為pattern =“ / api / ”:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM