Java Spring security 3.1.4多个http元素,表单登录';s
我完全知道这个问题已经被问了很多次,但我还没有找到答案。如果它是在那里,我道歉,并链接到它将非常感谢 当前工作配置 下面是我当前正在工作的配置的一个片段,它允许在没有任何安全性的情况下访问上面的Java Spring security 3.1.4多个http元素,表单登录';s,java,spring,spring-security,Java,Spring,Spring Security,我完全知道这个问题已经被问了很多次,但我还没有找到答案。如果它是在那里,我道歉,并链接到它将非常感谢 当前工作配置 下面是我当前正在工作的配置的一个片段,它允许在没有任何安全性的情况下访问上面的元素块,但需要具有其中一个角色的经过身份验证的用户登录 <http pattern="/" security="none" disable-url-rewriting="true" /> <http pattern="/login" security="none" disable-url
元素块,但需要具有其中一个角色的经过身份验证的用户登录
<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 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>
<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>
为什么这不起作用
这不起作用的原因是发生了以下情况:
- 如果请求与/foo/**匹配的URL,则页面将缓存在中。默认实现是通过在HttpSession中缓存请求来实现的
- 然后,Spring Security会将您发送到/login,其中可能有一个表单发布到/j_Spring_Security_check
- 当用户进行身份验证时,请求是/j_spring_security_check,它与/foo/**不匹配,因此它由第二个元素进行身份验证。
在身份验证时应用,而不是在发送到登录表单时应用。由于身份验证请求与/foo/**不匹配,用户将始终被发送到始终使用默认目标=“true”
默认目标url
<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>
<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>
亮点:
- 仅使用main(不要使用/foo/**块)
- 更新块以使用元素
- 创建HttpSessionRequestCache实例,该实例仅保存应重定向到的请求。换句话说,忽略应该始终发送到默认目标url的请求。示例配置将向默认目标url发送与/foo/**不匹配的任何请求
<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>