在tomcat上的grails spring security中登录用户的会话
Posted
技术标签:
【中文标题】在tomcat上的grails spring security中登录用户的会话【英文标题】:Logged in user's session mix up in grails spring security on tomcat 【发布时间】:2017-11-16 00:49:01 【问题描述】:我在 grails 中有一个应用程序,使用 spring-security 进行用户和角色管理。 因为,过去几天我面临一个奇怪的问题:当一个用户在某个时候登录时,用户变成了另一个用户(会话混淆)。
示例:用户 A 登录系统,用户 B 从另一个浏览器登录系统,当通过控制器操作移动时,用户 A 在某个随机点成为用户 A 系统中的用户 B,用户 B 也一样。
此问题处于生产阶段,而非开发阶段。
我在互联网上发现了一些类似的案例,但没有一个 grails。 Spring Security/JSF/Hibernate Accidental Session Hijacking on Tomcat?,这个类似的但在 jsf 中提到的解决方案似乎对我不起作用。另一个是Session mix up - apache httpd with mod_jk, tomcat, spring security - serving data of other user,但这里的问题似乎是因为 mod_jk 对我来说不是这样(我没有使用 mod_jk)。
我的系统版本:
Grails 版本:3.2.4 Groovy 版本:2.4.7 JVM 版本:1.8.0_05 服务器版本:Apache Tomcat/8.5.14 JVM版本:1.8.0_121-8u121-b13-0ubuntu1.16.04.2-b13【问题讨论】:
关键是 ISP 的东西。他们的基础设施中的某些东西,可能是 Web 代理或其他东西。 但是,ISP 真的会影响 Spring Security 跟踪的用户会话吗?因为除了我认为由 spring security 和 tomcat 维护的会话之外,我没有页面重定向或其他任何问题。 在请求通过 ISP 到达服务器之前,用于将浏览器与会话相关联的 cookie 值(会话 id)在某处被交换/更改。您是否尝试过使用 HTTPS 和安全 cookie?也许这样做可以防止这种情况发生。 【参考方案1】:我终于找到了问题。
罪魁祸首是 ISP(目前在尼泊尔的 Subisu 和 Mercantile 发现)。 他们实际上会缓存请求的整个页面,并且当另一个用户在特定时间范围内(几个小时)请求相同的 url 时,如果两个用户都在同一个 ISP 网络中,缓存的页面将被呈现给下一个用户。
我是如何发现我的问题的: 我做了一个实验。首先,我在同一 ISP 的不同计算机上使用两个不同的用户登录,我立即发现了问题。 然后我在那个 ISP 中注销了一个用户,从那个 ISP 断开,连接到另一个 ISP 并登录到系统。 现在,我在 ISP1 的 Computer1 中有 User1,在 ISP2 的 Computer2 中有 User2,即使浏览半小时后也没有发现问题。
我是如何解决的: 我生成了唯一的 uuid 并附加到每个菜单链接。这使得每个网址都不同,已经 4 天了,甚至一次都没有发现问题。 在某些菜单中,我没有放置唯一的 uuid,但问题仍然存在,但在我放置唯一字符串的菜单中没有。
【讨论】:
哇,这是一些非常糟糕的 ISP 行为。以上是关于在tomcat上的grails spring security中登录用户的会话的主要内容,如果未能解决你的问题,请参考以下文章
会话超时后重定向(Grails、Spring Security Core、Tomcat)
Grails 3 Spring Security LDAP 插件和 Tomcat 8
Grails 应用程序 - Tomcat 与 Weblogic 上的 JNDI
让 Grails、Spring Security Core Plugin 和 Tomcat 使用 X.509 证书身份验证