Spring security Spring选项创建会话=";决不;在某些情况下会被忽略吗?

Spring security Spring选项创建会话=";决不;在某些情况下会被忽略吗?,spring-security,Spring Security,对于某些web服务,我想禁用会话的使用。我在配置中添加了create session=“never”: <beans:bean id="http403EntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/> <http use-expressions="true" entry-point-ref="http403EntryPoint"

对于某些web服务,我想禁用会话的使用。我在配置中添加了create session=“never”:

<beans:bean id="http403EntryPoint"
    class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/>
<http use-expressions="true" entry-point-ref="http403EntryPoint"
    create-session="never">
    <custom-filter ref="x509Filter" position="PRE_AUTH_FILTER"/>
</http>

这适用于大多数情况,除非预认证用户具有未在应用程序中注册的客户端证书,因此我们的AuthenticationUserDetails服务抛出UsernameNotFoundException。 如果用户没有证书或注册了证书,则不会创建会话(HTTP响应中没有设置Cookie头)。在所描述的情况下,发送cookie。它(cookie和会话)也会在每次请求时进行评估,即使客户端证书发生了更改(基本上允许会话固定攻击-应用程序使用保存的身份验证,而不是在每次调用时重新进行身份验证)

我们使用SpringSecurity 3.0.5。使用Tomcat 6和7以及JBoss 7.1.1进行测试

为什么在所描述的场景中创建会话

PS:会话固定问题可能可以通过在AbstractPreAuthenticatedProcessingFilter中设置checkForPrincipalChanges来解决,但我对创建会话的原因很感兴趣。

罪魁祸首是:

在未经授权的访问情况下,AbstractPreAuthenticatedProcessingFilter类中的以下方法将创建一个会话并将异常存储在该会话中:

protected void unsuccessfulAuthentication(HttpServletRequest请求、HttpServletResponse响应、AuthenticationException失败){
SecurityContextHolder.clearContext();
if(logger.isDebugEnabled()){
调试(“由于异常而清除了安全上下文”,失败);
}
request.getSession().setAttribute(WebAttributes.AUTHENTICATION\u异常,失败);
}
在修复中,他们更改了最后一行,删除了getSession()调用,因此AuthenticationException存储在请求中

为了修复我们的项目,我创建了一个扩展X509AuthenticationFilter的新类,在那里我用相同的内容覆盖了方法unsuccessfulAuthentication,除了我还删除了getSession()调用