禁用SpringSecurity的SavedRequest存储逻辑

时间:2011-01-31 18:17:37

标签: spring spring-mvc spring-security

我们正在使用Spring Security来管理身份验证。我们看到的问题是,当用户的会话在启动GET表单和点击执行POST的保存按钮之间超时时,会将它们发送到登录页面,但是spring会在会话中保存原始发布信息。

我们的应用程序在登录后不会将它们带回原始URL,而是将它们发送回公共起始页面。这工作正常,但是当用户碰巧返回到他们最初尝试POST的页面时(表单GET和POST是相同的URL)Spring尝试自动重新提交POST,这不是我们想要的。

有没有办法在Spring中完全禁用SavedRequest存储逻辑?

5 个答案:

答案 0 :(得分:3)

我想问题this jira春季安全问题描述了你的问题以及如何解决这个问题。

答案 1 :(得分:2)

根据Nathan对Raghuram's answer的评论,使用命名空间XML,它是这样的:

<security:http>
    <security:request-cache ref="nullRequestCache" />
    <!-- ... -->
</security:http>

<bean id="nullRequestCache" class="org.springframework.security.web.savedrequest.NullRequestCache" />

答案 2 :(得分:1)

有两种情况: 1)如果您想在重新登录后使用,则应始终将用户转发到默认目标网址而不是原始请求的网址,然后在security.xml中输入always-use-default-target =“true”,如

<http auto-config="true"> 
.....
<form-login login-page="/login" always-use-default-target="true" default-target-url="/xyz" 
        authentication-failure-url="/login?error=true" login-processing-url="/j_security_check"/>
</http>

1)如果你想在重新登录后的会话超时,用户应该转发到原始请求的URL,但你不想重新提交表单,然后将session-fixation-protection =“newSession”放在你的security.xml中,如< / p>

<http auto-config="true">
<session-management session-fixation-protection="newSession"/> 
.....
</http>

请将会话管理标记作为http配置中的第一行。

答案 3 :(得分:0)

看起来(2.0)或(3.0)上的session-fixation-protection =“newSession”属性也将解决问题

答案 4 :(得分:0)

在Spring 4.2.5中,我也遇到了这个问题。

我的情况几乎相同:显示GET表单,等待会话超时,然后发布该表单。重新认证后,在我的应用程序中会显示一个起始页面。但是,如果用户随后导航到该GET表单并对其进行POST,则先前的POST参数将被记住并级联到当前请求,从而导致以逗号分隔的值 @RequestParam变量。

我将会话转储到身份验证控制器中,确实看到了一个名为“ SPRING_SECURITY_SAVED_REQUEST”的密钥。

spring文档说,默认情况下,“ SavedRequestAwareAuthenticationSuccessHandler”用于从会话中检索保存的请求数据并将其应用于请求。

我尝试使用什么也不做的successHandler,但是无法使其正常工作。

我也尝试过申请

http.sessionManagement()。sessionFixation()。newSession();

进入安全配置,但这没有帮助。

但是

http.requestCache()。requestCache(new NullRequestCache());

解决了这个问题。