2012-01-10 88 views
16

我希望更改爲create-session="stateless"是我的web應用程序中實現無狀態spring安全性的結束,但事實並非如此。因爲(我的假設)spring安全不會在會話中存儲任何內容,並且不能對安全的web請求進行身份驗證,所以彈簧安全性似乎不起作用。如何使用無狀態功能?創建會話無狀態使用

我似乎無法找到任何有關如何實現無狀態webapp的無狀態彈簧安全的相關示例。

謝謝!

回答

18

我有一個基於Spring的Web應用程序,它具有完全無狀態的安全性,唯一能讓它工作的方法是完全禁用會話創建(使用create-session="never")。這會強制每個請求重新進行身份驗證,因此您還需要將webapp配置爲使用HTTP基本身份驗證或摘要身份驗證(當然,通過HTTPS),因爲這些不需要特別複雜的協商(相反,表單基於登錄和OAuth的都需要會話,因爲它們對於建立認證上下文具有更復雜的過程)。這意味着您需要在<security:http>元素內放置一個像<security:http-basic />這樣的元素。

(這樣做的好處是它可以實現非常簡單的客戶端庫,因爲它們不需要進行cookie /會話管理。成本只是一些處理開銷 - 建立用戶的角色集參與必須重新計算每個請求 - 以及您可以使用哪種身份驗證機制的一些限制。)

+1

感謝您的回覆。我之前嘗試過基礎和消化,但是我無法從我的web應用程序「註銷」並在不重新啓動瀏覽器的情況下輸入新的憑據,我感到非常不舒服。另外,您認爲無界webapp/webservices能夠輕鬆地進行橫向擴展嗎?性能成本是否合理? – bertie 2012-01-11 00:41:42

+1

@Albert:如果沒有真正衡量成本,很難說很多成本。 :-)然而,如果你想註銷,那麼你需要維護一些客戶端狀態,這意味着做cookie處理;客戶端需要提供某種會話的指示,因爲HTTP本身是無狀態的,這是一個很難的要求。 – 2012-01-11 09:09:25

+0

我會建議的是,不要太擔心擴大開始,獲取用戶/客戶完全是一個問題。擴展時,真正的關鍵是您是否可以複製服務或是否有單例實例;通常,網絡服務器通常相對容易複製,但數據庫不是。 – 2012-01-11 09:16:39

24

Donal的答案基本正確,對於瀏覽器,您可能不希望使用無狀態應用程序。

僅供參考,如果您確實擁有無狀態應用程序(如RESTful客戶端),create-session="stateless"是更好的選擇。這個選項在Spring Security 3.1中引入。它將避免添加使用會話的Spring Security基礎設施的部分內容(例如HttpSessionSecurityContextRepositorySessionManagementFilter,RequestCacheFilter),這樣您可以獲得更精簡的設置。

隨着create-session="never",Spring Security將永遠不會創建會話本身,但會使用一個,如果你的應用程序。實際上,許多用戶甚至不知道他們正在創建會話,所以如果您真的不想要會話,那麼stateless是最好的選擇。

+0

+1:不知道這個選項,但是我還沒有深入研究3.1。 – 2012-01-11 13:28:37

+1

+1讓我只是說這個答案,只是救了我一個受傷的世界。 Tomcat不斷拒絕用戶訪問,因爲我的RESTful客戶端創建了很多會話。謝謝! – thatidiotguy 2012-11-09 22:02:33