Spring Security与Tomcat基本授权冲突

Posted

技术标签:

【中文标题】Spring Security与Tomcat基本授权冲突【英文标题】:Conflict between spring security and basic authorization of Tomcat 【发布时间】:2011-05-01 18:11:58 【问题描述】:

有人在Tomcat下激活基本授权时遇到spring security login的问题吗?

注销后加载登录页面时根本无法登录。如果您刷新页面并重试,一切都很好:)(。

【问题讨论】:

您应该将“信息”的后半部分更改为前半部分问题的答案。然后你就可以获得一些声望! 感谢您的建议! :) 【参考方案1】:

我找不到任何对这种行为的抱怨,并花了一整天的时间来找出问题所在。最后,它弹出原因是Tomcat中的一个错误,它在6.0.20到6.0.28的版本中可用(Bug 49598)。

问题在于,Tomcat 的基本授权和 Spring 安全性都在授权请求期间替换了会话。由于注销会使会话无效,因此在同一请求处理期间触发两个会话替换后的直接登录请求。但是,在错误的结果中,响应中的 Set-Cookie 标头仍然指向 Tomcat 给出的会话 id(它被 Spring 安全性无效,因为它在之后工作)。因此,下一个请求发送已销毁会话的 cookie。 Spring 创建的会话(包含签名用户)仍然无人认领。

最好的解决方案是 Tomcat 6.0.29 :-)。 如果有人在升级 Tomcat 时遇到问题,有 3 种可能性可以避免该错误:

    禁用 Tomcat 的会话替换。您可以在 context.xml 中配置 Valve

    <Valve className="org.apache.catalina.authenticator.BasicAuthenticator"
                                   changeSessionIdOnAuthentication="false"/>
    

    禁用 Spring 安全配置 security.xml 的会话替换。

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

    在注销后提供额外的重定向。这样 Tomcat 将在登录请求期间在会话中缓存一个 Principle。

也许这可以保护昨天像我一样发疯的人:)

关于, 埃德加

【讨论】:

以上是关于Spring Security与Tomcat基本授权冲突的主要内容,如果未能解决你的问题,请参考以下文章

将 Tomcat NTLM 与 Spring Security 一起使用

将 Tomcat 上的 Spring Security 和 Waffle 与角色检查集成

会话混合 - apache httpd 与 mod_jk、tomcat、spring security - 提供其他用户的数据

Tomcat 上的 Spring Security/JSF/Hibernate 意外会话劫持?

Spring Security 和 Tomcat 8 JSessionId 响应不匹配

Spring Security - 更改 RedirectStrategy 的所有实例