我在grails中有一个应用程序,使用spring-security进行用户和角色管理。 因为,在过去的几天里,我面临着一个奇怪的问题:当一个用户在某个时候登录时,用户变成了另一个用户(会话混淆)。
示例:用户 A 登录到系统,用户 B从另一个浏览器登录到系统,在移动控制器操作时,在某个随机点,用户 A 成为用户 A 系统中的用户 B,用户 B 也是如此。
这个问题在生产而不是开发中。
我在互联网上发现了一些类似的案例,但没有一个圣杯。 Spring Security/JSF/Hibernate意外会话劫持在Tomcat上?,这个类似的,但在jsf和提到的解决方案中似乎对我不起作用。另一个是会话混淆 - apache httpd 与 mod_jk、雄猫、弹簧安全 - 提供其他用户的数据,但这里的问题似乎是因为mod_jk对我来说并非如此(我没有使用mod_jk)。
我的系统版本:
- 圣杯版本:3.2.4
- 时髦版本: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(目前在尼泊尔的Subisu和商业中发现)。 他们实际上会缓存请求的整个页面,当另一个用户在特定时间范围(几个小时)内请求相同的 url 时,如果两个用户在同一 ISP 网络中,缓存的页面将被呈现给下一个用户。
我如何发现我的问题:我做了一个实验。首先,我在同一ISP的不同计算机上使用两个不同的用户登录,我立即发现了问题。 然后我注销了该ISP中的一个用户,与该ISP断开连接,连接到另一个ISP并登录到系统。 现在,我在ISP1的计算机1中有User1,在ISP2的计算机2中有User2 2,即使浏览了半小时也没有发现问题。
我如何修复它:我生成了唯一的uuid并附加到每个菜单链接。这使得每个网址都不同,已经 4 天了,问题甚至一次都没有发现。 在某些菜单中,我没有放置唯一的uuid,并且仍然是问题所在,但在我放置唯一字符串的菜单中却没有。