2011-01-24 123 views
1

我已經學習了一段時間的JMX bean,但是我卡住了。JMX客戶端會話

我有暴露了一些功能,以通過JMX遠程客戶端應用程序,雖然現有的安全功能可sufficiant大多數情況下,我的應用程序使用Apache四郎框架作爲安全後端。

我的問題是,我不怎麼收集客戶端數據serverside。 Shiro需要一種識別客戶端(主題)的方法,通常執行的線程與主題相關聯,但在線JMX文檔並未提供有關遠程JMX線程模型的多少線索。

我怎麼能一個客戶端與線程關聯起來還是有方法來檢索所述交互的MBean內的客戶數據?

回答

0

經過研究和嘗試不同的技術;有兩個獲獎者:

1-名爲ClientContext的新功能將成爲Java 7的一部分:Java 7尚未完成,ClientContext將打破向後兼容性。

2-附加四郎受到的AccessControlContext:這是我選擇的解決方案,Shiro的默認主題檢索機制不考慮Java的訪問控制上下文。我很久以前就進行了一項測試來測試這個測試,但它沒有奏效。現在我知道爲什麼:默認情況下,SecurityUtils.getSubject()調用將檢索到的Subject附加到當前調用的線程上,但這種方法是無用的,因爲線程可以在客戶端之間共享。但AccessControlContext功能更強大,它看起來像JMX與它很好地搭配;您的訪問控制上下文(在JMXAuthenticator的登錄過程中進行身份驗證)可以從MBeanServerForwarder訪問,甚至可以在您的MBean中訪問。我測試了這個與多個客戶端檢索他們的委託人,它只是起作用。

編輯:我如何附加Shiro受當前AccessControlContext?

1 - 創建一個使用生成器類Subject.Builder一個獨立的學科史郎。

2-驗證用戶(使用四郎受試者的登錄方法等)

3-創建一個可變JAAS受試者用含有四郎受試者私有憑證一個單集。

4-提供的JAAS受到底層Java安全系統(例如,返回一個JMXAuthenticator的認證方法中的主題)

甲助手類可以被創建來簡化這種方法。當你需要一個代表Shiro主體執行的動作(授權等)時,從AccessControlContext獲取它並使用其中一個Subject.execute ...方法。這可以在代理或轉發器內執行(如MBeanServerForwarder)。

+0

@Farrukh Najmi新增了我如何做的詳細說明 – 2011-03-02 08:37:54