我正在使用spring security 3.1.4,我遇到以下问题:
我实现了自定义SavedRequestAwareAuthenticationSuccessHandler
,并实现了缓存SessionRegistry
。
问题是我在SessionRegistry.registerNewSession
中获得的会话ID与我在SavedRequestAwareAuthenticationSuccessHandler .onAuthenticationSuccess
首先调用会话注册。 什么是正确的?我怎样才能在两者中得到相同的结果?
自定义SessionRegistry.registerNewSession是否会采用spring安全会话ID?
答案 0 :(得分:1)
只是一个猜测。但这听起来像是下面的问题。
默认情况下,在Spring安全性中,启用了一项称为会话固定保护的功能。 出于安全原因,它会将会话迁移到新ID。 想象一下,有人通过电子邮件为您提供了现有会话ID的网址,您点击该链接并登录。 现在,可以为您提供网址的人可以使用提供的会话ID简单地破解您的帐户。
如果要禁用它,可以在弹簧安全配置中添加以下行。但要注意风险。
<http .. >
...
<session-management session-fixation-protection="none">
...
</http>
答案 1 :(得分:0)
我解决问题的方法是执行以下步骤:
为SessionFixationProtectionStrategy
<bean id="sessionFixationProtectionStrategy" class="org.springframework.security.web.authentication.session.ChangeSessionIdAuthenticationStrategy" />
将#1中的新bean作为属性添加到AuthenticationFilter
bean
<bean id="authenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
...
<property name="sessionAuthenticationStrategy" ref="sessionFixationProtectionStrategy" />
...
</bean>
在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
用作SessionAuthenticationStrategy
,https://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