春季安全会话超时

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].

因此您需要添加一个实现LogoutHandlerLogoutFilter 处理程序的客户注销处理程序。

<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,这些可能有帮助,您需要添加一个实现 LogoutHandlerLogoutFilter 处理程序的注销处理程序 这没有帮助,我实际上发现有两个登录请求从我的一端进入,一旦我解决了这个问题,这种行为就不会再发生了。感谢您的帮助。非常感谢您分享您的想法。

以上是关于春季安全会话超时的主要内容,如果未能解决你的问题,请参考以下文章

春季安全会话超时

在春季安全中注销特定会话ID

春季安全会话到期

春季安全并发会话不起作用

从春季安全会话序列化中排除属性?

春季安全会话注册表为空