春季安全会话超时
Posted
技术标签:
【中文标题】春季安全会话超时【英文标题】:spring security session times out 【发布时间】:2017-05-03 01:32:57 【问题描述】:我使用的是 spring security 4.1,我面临的问题是当我尝试登录时,我被多次发送回会话过期页面。我尝试了多种方法,例如添加我自己的 HttpSessionListener 也通过添加 org.springframework.security.web.session.HttpSessionEventPublisher 但会话不断到期。我在其中一个问题中阅读了对这种行为的解释 “在某些情况下,Spring Security 可能会使会话无效(例如,在登录后,用户会获得一个新的 HttpSession)。” 我使用 Fiddler 工具查看发生了什么,我看到用户已通过身份验证,但立即被重定向到会话过期页面。我想允许同一个用户根据需要多次登录。我还在某些地方读到这将有助于迁移到 spring 3.x,但我认为这可能适用于使用旧版本 spring 的情况。 请建议。谢谢你
<http auto-config="true" use-expressions="true"
authentication-manager-ref="authenticationManager">
<session-management
invalid-session-url="/login?eventType=sessionTimedOut"
session-fixation-protection="none"
/>
<intercept-url pattern="/login" access="permitAll" />
<intercept-url pattern="/*" access="hasAnyAuthority('FF_USER','FF_ADMIN')" />
<form-login login-page="/login"
authentication-success-handler-ref="authenticationSuccessHandler"
authentication-failure-handler-ref="customAuthenticationFailureHandler"
login-processing-url="/j_spring_security_check"
username-parameter="j_username"
password-parameter="j_password"
/>
<logout invalidate-session="false" logout-success-url="/login?eventType=logout"
logout-url="/j_spring_security_logout" delete-cookies="JSESSIONID"/>
<csrf token-repository-ref="csrfTokenRepository" />
</http>
<beans:bean id="csrfTokenRepository"
class="org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository">
<beans:property name="headerName" value="X-XSRF-TOKEN" />
</beans:bean>
<beans:bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
<beans:property name="defaultTargetUrl" value="/home"/>
<beans:property name="alwaysUseDefaultTargetUrl" value="true"/>
</beans:bean>
<beans:bean id="customAuthenticationFailureHandler" class="*.*.CustomAuthenticationFailureHandler">
<beans:property name="defaultFailureUrl" value="/login?eventType=error"></beans:property>
<beans:property name="baseFailureUrl" value="/login?eventType=error"></beans:property>
</beans:bean>
<beans:bean id="authenticationManager"
class="org.springframework.security.authentication.ProviderManager">
<beans:constructor-arg>
<beans:list>
<beans:ref bean="ldapAuthenticationProvider" />
</beans:list>
</beans:constructor-arg>
<beans:property name="eraseCredentialsAfterAuthentication"
value="true" />
</beans:bean>
【问题讨论】:
【参考方案1】: <http>
<logout delete-cookies="JSESSIONID" />
</http>
Unfortunately this can't be guaranteed to work with every servlet container, so you will need to test it in your environment[8].
因此您需要添加一个实现LogoutHandler
到LogoutFilter
处理程序的客户注销处理程序。
<http auto-config="true" use-expressions="true" authentication-manager-ref="authenticationManager">
...
<custom-filter ref="logoutFilter" position="LOGOUT_FILTER" />
...
</http>
<bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
<constructor-arg name="logoutSuccessUrl" value="/login?eventType=logout" />
<!-- implement LogoutHandler, Websphere log out -->
<constructor-arg name="handlers" ref="customer logout " />
<property name="filterProcessesUrl" value="/j_spring_security_logout" />
</bean>
【讨论】:
我也用过。在这种情况下,当我注销时,我会被发送到会话过期页面而不是注销页面。有问题的问题间歇性地发生,如果我重试,我可以登录,但问题是为什么会话在登录后立即过期。它应该启动并在 web.xml 中给出的持续时间内保持不变即使您在上面提到的更改,我也遇到了同样的问题。我用的Websphere可能有什么可以改变的吗? erase-cookie-in-websphere-how-to-log-out 和 WSSecurityHelper,这些可能有帮助,您需要添加一个实现LogoutHandler
到 LogoutFilter
处理程序的注销处理程序
这没有帮助,我实际上发现有两个登录请求从我的一端进入,一旦我解决了这个问题,这种行为就不会再发生了。感谢您的帮助。非常感谢您分享您的想法。以上是关于春季安全会话超时的主要内容,如果未能解决你的问题,请参考以下文章