[英]Spring security 3.1.4 multiple http elements with form-login's
我完全知道這個問題已經問過很多遍了,但是我還沒有偶然發現答案。 如果它在那里,我很抱歉,對此的鏈接將不勝感激。
以下是我當前正在使用的配置的摘要,該配置允許在沒有任何安全性的情況下訪問上述<http />
元素塊,但是需要具有角色之一的經過身份驗證的用戶才能登錄。
<http pattern="/" security="none" disable-url-rewriting="true" />
<http pattern="/login" security="none" disable-url-rewriting="true" />
<http pattern="/cookieInfo" security="none" disable-url-rewriting="true" />
<http pattern="/error" security="none" disable-url-rewriting="true" />
<http pattern="/cookiesDisabled" security="none" disable-url-rewriting="true" />
<http pattern="/loginFailed" security="none" disable-url-rewriting="true" />
<http pattern="/static/**" security="none" disable-url-rewriting="true" />
<http access-decision-manager-ref="accessDecisionManager" disable-url-rewriting="true">
<custom-filter before="FIRST" ref="cookiePresentFilter" />
<intercept-url pattern="/**" access="ROLE_1,ROLE_2,ROLE_3" />
<form-login login-page="/login" default-target-url='/loginSuccess' always-use-default-target='true' authentication-failure-url="/loginFailed" />
<logout />
</http>
我想有一個特殊的部分,下面顯示為<http pattern="/foo/**" ...
,其中沒有強制使用的默認目標。 我希望在全部捕獲之前僅具有一個更具體的模式就足夠了,但是在所有情況下,它似乎都只使用最終的全部捕獲塊。 我已經嘗試將intercept-url pattern="/**"
設為intercept-url pattern="/foo/**"
也無濟於事。
有任何想法嗎?!
<http pattern="/" security="none" disable-url-rewriting="true" />
<http pattern="/login" security="none" disable-url-rewriting="true" />
<http pattern="/loginFailed" security="none" disable-url-rewriting="true" />
<http pattern="/static/**" security="none" disable-url-rewriting="true" />
<http pattern="/foo/**" access-decision-manager-ref="accessDecisionManager" disable-url-rewriting="true">
<intercept-url pattern="/**" access="ROLE_1,ROLE_2,ROLE_3" />
<form-login login-page="/login" authentication-failure-url="/loginFailed" />
<logout />
</http>
<http access-decision-manager-ref="accessDecisionManager" disable-url-rewriting="true">
<intercept-url pattern="/**" access="ROLE_1,ROLE_2,ROLE_3" />
<form-login login-page="/login" default-target-url='/loginSuccess' always-use-default-target='true' authentication-failure-url="/loginFailed" />
<logout />
</http>
之所以不起作用,是因為發生了以下情況:
always-use-default-target="true"
在驗證時應用,而不是在發送到登錄表單時應用。 由於身份驗證請求與/ foo / **不匹配,因此始終會將用戶發送到default-target-url
要解決此問題,您需要執行以下操作:
<http pattern="/foo/**" ...>
<intercept-url pattern="/foo/login" access="ROLE_ANONYMOUS"/>
<intercept-url pattern="/**" access="ROLE_1,ROLE_2,ROLE_3" />
<form-login
...
default-target-url="/loginSuccess
login-page="/foo/login"
login-processing-url="/foo/authenticate" />
...
</http>
/富/登錄
<form method="post" action="<c:url value='/foo/authenticate'/>">
...
</form>
更改的重點:
always-use-default-target="false"
如果RequestCache為空,Spring Security會將用戶發送到default-target-url。 這意味着,如果RequestCache忽略了要發送到default-target-url的請求,則所有內容都將起作用。
對於您的示例,您可以執行以下操作:
<http access-decision-manager-ref="accessDecisionManager" disable-url-rewriting="true">
<intercept-url pattern="/**" access="ROLE_1,ROLE_2,ROLE_3" />
<form-login login-page="/login" default-target-url='/loginSuccess' always-use-default-target='true' authentication-failure-url="/loginFailed" />
<logout />
<request-cache ref="requestCache"/>
</http>
<bean:bean id="requestCache" class="org.springframework.security.web.savedrequest.HttpSessionRequestCache">
<bean:property name="requestMatcher">
<bean:bean class="org.springframework.security.web.util.RegexRequestMatcher">
<bean:constructor-arg value="^(?!/foo/).+"/>
<bean:constructor-arg><bean:null/></bean:constructor-arg>
<bean:constructor-arg value="true"/>
</bean:bean>
</bean:property>
</bean:bean>
強調:
將您的配置文件更改為以下內容:
<http access-decision-manager-ref="accessDecisionManager" disable-url-rewriting="true">
<intercept-url pattern="/foo/**" access="permitAll" />
<intercept-url pattern="/**" access="ROLE_1,ROLE_2,ROLE_3" />
<form-login login-page="/login" default-target-url='/loginSuccess' always-use-default-target='true' authentication-failure-url="/loginFailed" />
<logout />
</http>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.