6

前些日子發生了一件非常奇怪而令人尷尬的事情,我沒有用詞來形容發生了什麼。在Tomcat上發生Spring Security/JSF/Hibernate意外會話劫持?

我的應用程序在Tomcat 7上運行與JSF 2.1,Hibernate 4,Spring Security集成的Spring 3。我曾與C級別的重要人員通話,我們同時在測試環境中同時相同的頁面。當他的網頁提供我的個人帳戶詳情時,他幾乎在同一時刻瀏覽到我正在導航的頁面。我不相信他,所以我走到他的辦公室,果然,他以某種方式登錄爲我的賬戶,他沒有密碼。

該應用程序將保護病人的健康信息,所以我被命令爲C級人員提供發生了什麼事情的完整報告,但我無法找到這是可能的。我搜索了代碼庫,沒有任何結果。我試圖在多個場合重現確切的場景,並且從未能夠重現它。我甚至沒有受過教育的猜測,我很高興。

我想也許可能會對存儲在Tomcat應用程序上下文實現中的會話有一些不安全的線程操作,但如果它不可重現,我無法證明這一點。我還認爲,由於Spring Security在其他請求之前以Filter的形式運行,並且可能會轉發其他servlet過濾器中的其中一個受到干擾。另外兩個是我最近添加的Primefaces File Upload過濾器和Omnifaces SEO過濾器。

Omnifaces過濾器事實上干擾了Primefaces File Upload過濾器,我不得不對它的配置進行修改,以便它們中的兩個可以很好地對待,所以我仍然覺得這可能也是可能的。

Spring Security中是否有任何已知的錯誤導致了類似的問題? Tomcat中是否存在關於意外地從ApplicationContext提供錯誤會話狀態的問題?是否有其他人遇到類似的問題或對此有獨特的見解?

編輯:不久發佈此之後,我發現這一點,貼僅在幾天前:

Session mix up - apache httpd with mod_jk, tomcat, spring security - serving data of other user

這幾乎是完全一樣的設置爲我的Apache httpd的+ mod_jk的前面插件Tomcat的肯定使我不是瘋了:)

UPDATE:

我能夠重現問題以米沒有mod_jk或Apache的開發環境,所以我可以可靠地排除這個問題。

+1

當人們在這裏看到其他人的賬號時,就會被ISP過度激烈地緩存。那麼,您和應用程序之間是否存在代理/緩存? – ChrisF 2013-02-13 17:30:54

+0

@ChrisF只需將Apache委託給mod_jk Tomcat連接器即可。它是運行Apache和Tomcat的單臺服務器。也許Apache正在緩存一些東西?我會嘗試刪除它,看看我是否可以重現錯誤。 – 2013-02-13 17:44:46

回答

4

我想通了:)

這是不大不小的開發商錯誤的,但它也是春天的一個可笑的默認行爲。 我有一個名爲SessionBean的JSF Managed Bean,我聲明爲@SessionScope。當你集成JSF和Spring時,JSF依賴注入與Spring依賴注入發生衝突,所以Spring重寫了處理它的JSF模塊,而不是隻包裝Spring DI。所以當我將JSF ManagedBean聲明爲Session Scoped時,我還必須給它一個@Controller註釋,以便它也被識別爲Spring Bean。

原來,Spring並不瞭解JSF @RequestScoped@SessionScoped註釋。Spring有自己的註釋,簡稱爲@Scope(value = "request|session|singleton?|etc...")

因爲Spring沒有識別出我設置的JSF範圍,所以它將它作爲bean的默認值作爲SINGLETON處理。

所以每次有人登錄時,它會覆蓋我用來緩存從身份驗證主體獲取的登錄用戶的屬性。然後每個做任何事的人都以不同的用戶身份登錄。

不錯的春天順便警告你你錯誤地配置了你該死的bean。

感謝各位的幫助,希望對未來的訪客有好處!