我在JBoss 4.0.4中使用httpinvoker(稍微陳舊)來進行EJB調用。 由於有太多的客戶打電話給我的服務器,我想識別服務器中的每個呼叫的客戶端。jboss httpinvoker中的客戶端標識符(審計)
有沒有辦法用JBoss httpinvoker來做到這一點?
我可以想象在每個HTTP請求中添加一個標頭來標識我的客戶端,但無法找到在httpinvoker中添加標頭的方法。
我在JBoss 4.0.4中使用httpinvoker(稍微陳舊)來進行EJB調用。 由於有太多的客戶打電話給我的服務器,我想識別服務器中的每個呼叫的客戶端。jboss httpinvoker中的客戶端標識符(審計)
有沒有辦法用JBoss httpinvoker來做到這一點?
我可以想象在每個HTTP請求中添加一個標頭來標識我的客戶端,但無法找到在httpinvoker中添加標頭的方法。
審計建立在一個名稱上,從而以某種方式建立在認證方案上。
因此,我建議使用標準的客戶端身份驗證基礎結構來解決您的問題。這也適用於RMI(它不綁定到HTTP),並且用戶ID甚至傳遞到您的EJB中。
服務器
security-domain
(ejb.jar:META-INF/jboss.xml中)application-policy
其他這只是UsersRolesLoginModule
(CONF /登錄 - config.xml中);這是默認策略,它已經配置。UsersRolesLoginModule
客戶
javax.security.auth.callback.CallbackHandler
回調類:此回調時,當認證需要用戶和密碼。javax.security.auth.login.LoginContext
;作爲第二個參數傳遞迴調處理程序;使用InitialContext
-Djava.security.auth.login.config=.../jboss-4/client/auth.conf
當您啓動客戶端這樣,用戶ID從客戶端傳遞到EJB調用login()
的LoginContext
SessionContext
實例上調用getCallerPrincipal()
來獲取用戶標識。我測試了這對JBoss的4.2.3 其他信息:JBoss client authentication
附錄1:
使用RMI或HTTP,密碼不以安全的方式運輸。在這種情況下,只需使用一個虛擬密碼,這對審計是可以的。另一方面,如果您通過HTTPS使用RMI over SSL或HttpInvoker,則可以快速更改爲真實且安全的身份驗證。
附錄2:
我不知道,如果它的工作原理沒有定義角色。也許你不得不
security-role-ref
每個EJB和security-role
和method-permission
在assembly-descriptor
更新
因爲已經有一個登錄模塊,有可能是另一種可能性:
如果您有登錄模塊的源代碼,您可以使用另一個TextCallback
從客戶端獲取更多信息(在您的情況下是用戶標識)。該信息可用於創建自定義Principal
。在EJB中,getCallerPrincipal()
的結果可以轉換爲自定義主體。
謝謝鈹。我們已經有了這個解決方案。但我們使用相同的(或至少每個組使用相同的)userId。問題是存在多個運行相同應用程序的實例(鏡像),並且我們無法爲每個應用程序添加新的用戶標識。它不可擴展。我們擁有大量的服務器並且以極快的速度增長。 –
@Suraj Chandran在這種情況下,我建議創建一個虛擬的LoginModule,讓其通過一切。這樣客戶可以生成UUID或提供任何用戶ID。作爲替代,如果RDBMS/LDAP中已經有數據,請考慮針對這些數據庫使用/實現LoginModule。 – Beryllium
@Berryllium當前的登錄模塊基於Kerberos,這是安全性所必需的。但是,您的意思是我添加了一個額外的登錄模塊(以及現有的模塊),它可以取得虛擬憑證,並且從服務器端獲得兩個登錄模塊的主體?這甚至有可能嗎? –