2013-07-12 32 views
0

我在JBoss 4.0.4中使用httpinvoker(稍微陳舊)來進行EJB調用。 由於有太多的客戶打電話給我的服務器,我想識別服務器中的每個呼叫的客戶端。jboss httpinvoker中的客戶端標識符(審計)

有沒有辦法用JBoss httpinvoker來做到這一點?

我可以想象在每個HTTP請求中添加一個標頭來標識我的客戶端,但無法找到在httpinvoker中添加標頭的方法。

回答

1

審計建立在一個名稱上,從而以某種方式建立在認證方案上。

因此,我建議使用標準的客戶端身份驗證基礎結構來解決您的問題。這也適用於RMI(它不綁定到HTTP),並且用戶ID甚至傳遞到您的EJB中。

服務器

  • 把EJB在security-domain(ejb.jar:META-INF/jboss.xml中)
  • 您可以使用application-policy其他這只是UsersRolesLoginModule(CONF /登錄 - config.xml中);這是默認策略,它已經配置。
  • 添加users.properties和roles.properties您ejb.jar文件(頂層包):這些被使用的UsersRolesLoginModule
  • 對於每個用戶,加上他的名字和一個(假)密碼的users.properties

客戶

  • 創建它實現了一個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

  • 連接的情況下,通常到EJB服務器(作爲標準認證過程的一部分)。現在,在EJB方法中,您可以通過在SessionContext實例上調用getCallerPrincipal()來獲取用戶標識。我測試了這對JBoss的4.2.3

    其他信息:JBoss client authentication


    附錄1:

    使用RMI或HTTP,密碼不以安全的方式運輸。在這種情況下,只需使用一個虛擬密碼,這對審計是可以的。另一方面,如果您通過HTTPS使用RMI over SSL或HttpInvoker,則可以快速更改爲真實且安全的身份驗證。


    附錄2:

    我不知道,如果它的工作原理沒有定義角色。也許你不得不

    • 在roles.properties爲每個用戶添加一行:添加一個連接的作用,例如
    • 添加角色定義在ejb-jar.xml以及:security-role-ref每個EJB和security-rolemethod-permissionassembly-descriptor

    更新

    因爲已經有一個登錄模塊,有可能是另一種可能性:

    如果您有登錄模塊的源代碼,您可以使用另一個TextCallback從客戶端獲取更多信息(在您的情況下是用戶標識)。該信息可用於創建自定義Principal。在EJB中,getCallerPrincipal()的結果可以轉換爲自定義主體。

  • +0

    謝謝鈹。我們已經有了這個解決方案。但我們使用相同的(或至少每個組使用相同的)userId。問題是存在多個運行相同應用程序的實例(鏡像),並且我們無法爲每個應用程序添加新的用戶標識。它不可擴展。我們擁有大量的服務器並且以極快的速度增長。 –

    +0

    @Suraj Chandran在這種情況下,我建議創建一個虛擬的LoginModule,讓其通過一切。這樣客戶可以生成UUID或提供任何用戶ID。作爲替代,如果RDBMS/LDAP中已經有數據,請考慮針對這些數據庫使用/實現LoginModule。 – Beryllium

    +0

    @Berryllium當前的登錄模塊基於Kerberos,這是安全性所必需的。但是,您的意思是我添加了一個額外的登錄模塊(以及現有的模塊),它可以取得虛擬憑證,並且從服務器端獲得兩個登錄模塊的主體?這甚至有可能嗎? –