2017-06-14 104 views
0

我在grails中为用户和角色管理使用spring-security。 因为,过去几天我面临一个奇怪的问题:当一个用户登录某个时候,用户变成另一个用户(会话混淆)。登录用户会话在tomcat上混淆了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
  • Server版本:的Apache Tomcat/8.5.14
  • JVM版本:1.8.0_121-8u121-b13-0ubuntu1.16.04.2-B13
+0

关键在于ISP。在他们的基础设施内部,网络代理或其他东西。 –

+0

但是,ISP真的会影响春季安全跟踪的用户会话吗?因为我没有关于页面重定向的问题,或者我认为由spring security和tomcat维护的会话。 – Jumper

+0

听起来好像用来关联浏览器和会话的cookie值(会话ID)在到达服务器之前,在通过ISP的请求期间在某处发生了交换/更改。您是否尝试过使用HTTPS并保护Cookie?也许这样做可以防止这种情况发生。 –

回答

0

最后,我发现了这个问题。

罪魁祸首是互联网服务提供商(目前在尼泊尔Subisu和Mercantile发现)。 他们实际上会缓存所请求的整个页面,并且当某个时间段(几个小时)内另一个用户请求相同的URL时,为同一ISP网络中的两个用户提供缓存页面将呈现给下一个用户。

我如何发现我的问题: 我做了一个实验。首先,我使用两台不同的用户在同一台​​ISP的不同计算机上登录,我立即发现问题。 然后我注销了该ISP中的一个用户,与该ISP断开连接,连接到另一个ISP并登录到系统。 现在,我在ISP1中的Computer1中有User1,在ISP2中有Computer2中的User2,即使浏览半小时后也没有找到问题。

我如何修复它: 我生成了独特的uuid并附加到每个菜单链接。这使得每个网址都有所不同,已经过了4天,问题甚至没有发现过。 在一些菜单中,我没有把独特的uuid,但仍然是问题,但不是在那些我把唯一的字符串。

+0

哇,这是一些非常可怕的ISP行为。 – doelleri