2013-01-06 69 views
0

我有一個使用基本身份驗證與Spring Security進行安全保護的SOAP Web服務。Spring Security註銷和獨立應用程序

我寫了一個Swing應用程序來訪問這個Web服務。當應用程序啓動時,登錄對話框出現在用戶輸入其憑證的地方。當用戶單擊「登錄」按鈕時,將使用給定的憑證創建JAXWS客戶端。我也想給登錄用戶註銷的可能性。 Spring Security需要訪問URL才能註銷。這在獨立應用程序中如何工作?這應該通過CXF還是使用簡單的HTTP客戶端來完成?

回答

0

這並不重要,你如何實現這一點。唯一的要求是創建HTTP GET來註銷URL,但您的請求應包含會話的會話ID。否則,Spring無法知道哪個會話無效。所以,我認爲最簡單的方法就是使用你當前使用的同一個客戶端。

+0

謝謝您的回答。我使用JaxWsProxyFactoryBean來創建我用來調用我的Web服務方法的代理。是否有可能通過代理獲取註銷URL? –

+0

@MickaelMarrache,你確定JAX客戶端會緩存會話cookie嗎? –

+0

@ Michael-O我認爲JAX客戶端會緩存JSESSIONID cookie,因爲這是我從登錄到登出時使用的客戶端。此外,我已將BindingProvider.SESSION_MAINTAIN_PROPERTY屬性設置爲true。 –

1

完全避免會話並讓您的JAXClient在每個連接請求上重新進行身份驗證。使用Spring Security 3.1提供的stateless配置您的secuity.xml。

+0

很明顯,無狀態時它更容易,但我想限制每個用戶的應用程序的一個連接實例(使用Spring Security的併發控制功能,但只有在服務維護會話時此功能才相關)。我會考慮這種可能性。您是否知道如何配置客戶端以對每個請求重新進行身份驗證? –

+0

然後限制同一主機上啓動的Swing客戶端的數量。 –

+0

@MarcelStör問題是不同的。例如,如果用戶與其他用戶共享其憑據。每個用戶可以在他的主機上運行一個客戶端實例,都使用相同的憑據。這就是我想要避免的。 –

0

好吧,我不會爭論有狀態與無狀態。如果您需要從Swing應用程序註銷,則只需將HTTP GET請求發送到配置的註銷URL,並沿其發送會話ID。你甚至都不需要Apache的HttpClient此:

String url = "http://example.com/logout"; 
String charset = "UTF-8"; 
String session = ";jsessionid=" + sessionId; 
URLConnection connection = new URL(url + session).openConnection(); 
connection.setRequestProperty("Accept-Charset", charset); 
InputStream response = connection.getInputStream(); 
// ... 

https://stackoverflow.com/a/2793153/131929(射擊練習一個HTTP GET請求)瞭解詳情。

您可以附加到會話ID直接將URL如上圖或將其作爲一個普通餅乾頭,像這樣:

connection.addRequestProperty("Cookie", "JSESSIONID=" + sessionId); 
+0

感謝您的回答,這是我正在尋找的,但會話ID是作爲cookie發送的,我可以從CXF的HTTPConduit獲得,但是我沒有看到會話ID作爲查詢參數發送。 –

+0

這不是一個查詢字符串參數(對不起,更正了我的代碼),而是一個不支持cookie的用戶代理的特殊機制,例如如果你在瀏覽器中禁用cookies。見例如詳情請參閱http://javarevisited.blogspot.ch/2012/08/what-is-jsessionid-in-j2ee-web.html。但是,我添加了有關如何設置會話ID cookie的說明。 –