2017-06-14 88 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

相關問題