Spring安全性更改sessionid

时间:2014-05-12 15:35:14

标签: java spring spring-mvc spring-security

我正在使用spring security 3.1.4,我遇到以下问题: 我实现了自定义SavedRequestAwareAuthenticationSuccessHandler,并实现了缓存SessionRegistry。 问题是我在SessionRegistry.registerNewSession中获得的会话ID与我在SavedRequestAwareAuthenticationSuccessHandler .onAuthenticationSuccess

中的会话ID不同

首先调用会话注册。 什么是正确的?我怎样才能在两者中得到相同的结果?

自定义SessionRegistry.registerNewSession是否会采用spring安全会话ID?

2 个答案:

答案 0 :(得分:1)

只是一个猜测。但这听起来像是下面的问题。

默认情况下,在Spring安全性中,启用了一项称为会话固定保护的功能。 出于安全原因,它会将会话迁移到新ID。 想象一下,有人通过电子邮件为您提供了现有会话ID的网址,您点击该链接并登录。 现在,可以为您提供网址的人可以使用提供的会话ID简单地破解您的帐户。

如果要禁用它,可以在弹簧安全配置中添加以下行。但要注意风险。

<http .. >
...
<session-management session-fixation-protection="none">
...
</http>

答案 1 :(得分:0)

我解决问题的方法是执行以下步骤:

  1. SessionFixationProtectionStrategy

    添加了一个新bean
    <bean id="sessionFixationProtectionStrategy" class="org.springframework.security.web.authentication.session.ChangeSessionIdAuthenticationStrategy" />
    
  2. 将#1中的新bean作为属性添加到AuthenticationFilter bean

    <bean id="authenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
        ...
        <property name="sessionAuthenticationStrategy" ref="sessionFixationProtectionStrategy" />
        ...
    </bean>
    
  3. session-fixation-protection标签中添加了具有<security:http>属性的会话管理配置

    <security:http>
        <security:headers />
        <security:csrf disabled="true"/>
        ...
        <security:session-management session-fixation-protection="changeSessionId" />
    </security:http>
    

对于Spring 3.1之前的Java EE Servlet API实现,SessionFixationProtectionStrategy用作SessionAuthenticationStrategyhttps://docs.spring.io/spring-security/site/docs/4.2.13.BUILD-SNAPSHOT/apidocs/org/springframework/security/web/authentication/session/SessionFixationProtectionStrategy.html,而对于Servlet API 3.1,则应使用ChangeSessionIdAuthenticationStrategy