我们正在使用Spring Security来管理身份验证。我们看到的问题是,当用户的会话在启动GET表单和点击执行POST的保存按钮之间超时时,会将它们发送到登录页面,但是spring会在会话中保存原始发布信息。
我们的应用程序在登录后不会将它们带回原始URL,而是将它们发送回公共起始页面。这工作正常,但是当用户碰巧返回到他们最初尝试POST的页面时(表单GET和POST是相同的URL)Spring尝试自动重新提交POST,这不是我们想要的。
有没有办法在Spring中完全禁用SavedRequest存储逻辑?
答案 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());
解决了这个问题。