【发布时间】:2015-06-19 15:34:23
【问题描述】:
我有一个基于 Spring Security 和 Spring MVC 的 Spring 4 Web 应用程序。它包括 CSRF 保护,以及记住我的功能。其后包括配置的相关部分。
<sec:http auto-config="true">
<sec:intercept-url pattern="/public/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<sec:intercept-url pattern="/**" access="ROLE_USER" />
<sec:access-denied-handler error-page="/403" />
<sec:form-login
login-page="/public/login"
authentication-failure-url="/public/login?error"
authentication-success-handler-ref="authenticationSuccessHandler"
username-parameter="userName"
password-parameter="password" />
<sec:logout
logout-url="/logout"
logout-success-url="/public/login?logout"
delete-cookies="JSESSIONID" />
<sec:remember-me
services-ref="rememberMeServices" key="***" />
<sec:csrf />
</sec:http>
<bean id="securityService" class="custom UserDetailsService" />
<bean id="authenticationSuccessListener" class="custom ApplicationListener" />
<bean id="rememberMeServices" class="org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices">
<property name="key" value="***" />
<property name="userDetailsService" ref="securityService" />
<property name="tokenRepository" ref="custom PersistentTokenRepository" />
<property name="parameter" value="rememberMe" />
</bean>
<bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
<property name="targetUrlParameter" value="targetUrl" />
</bean>
场景:用户打开一个 POST 表单并开始填写它,接到一个电话或其他什么,会话超时,使 CSRF 令牌无效,用户提交他的表单,并得到一个“拒绝访问”。我一直在通过手动删除浏览器中的 JSESSIONID cookie(留下 SPRING_SECURITY_REMEMBER_ME_COOKIE)来测试这种情况。
期望:当会话超时时,remember-me 启动,对用户进行身份验证,请求被成功处理。
问题:鉴于 CSRF 和记住我的性质,我的期望是否合理,还是存在根本缺陷?推出我自己的 CsrfTokenRepository 实现,将令牌存储在数据库中而不是会话中是否有意义?对于上述场景,普遍接受的方法是什么?
提前致谢。
【问题讨论】:
-
记住我会让你跳过登录过程,但出于安全原因,CSRF 令牌和会话属性必须在过期时间后失效。所以我的建议是增加过期时间以更合适价值。
-
感谢您的评论。这是我作为临时解决方案所做的,我想我会保留它。
标签: java spring spring-security