我有一个使用 spring-security 进行用户和角色管理的 grails 应用程序。 因为,过去几天我遇到了一个奇怪的问题:当一个用户在某个时候登录时,该用户变成了另一个用户( session 混淆)。
示例:用户 A 登录到系统,用户 B 从另一个浏览器登录到系统,当通过 Controller 操作时,在某个随机点,用户 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
- 常规版本: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 和 Mercantile 发现)。 他们实际上会缓存请求的整个页面,并且当另一个用户在特定时间范围内(几个小时)请求相同的 url 时,如果两个用户都在同一个 ISP 网络中,缓存的页面将呈现给下一个用户。
我是如何发现我的问题的: 我做了一个实验。首先,我在同一个 ISP 的不同计算机上以两个不同的用户登录,我立即发现了问题。 然后我注销了该 ISP 中的一个用户,与该 ISP 断开连接,连接到另一个 ISP 并登录到系统。 现在,我在 ISP1 的 Computer1 中有 User1,在 ISP2 的 Computer2 中有 User2,即使浏览了半小时也没有发现问题。
我是如何修复它的: 我生成了唯一的 uuid 并附加到每个菜单链接。这使得每个 url 都不同,已经 4 天了,甚至一次都没有发现问题。 在某些菜单中,我没有放置唯一的 uuid 并且仍然是问题,但在我放置了唯一字符串的菜单中没有。
关于tomcat - 登录用户的 session 在 tomcat 上的 grails spring security 中混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44535085/