1

私はしばらくの間JMXを勉強してきましたが、行き詰まっています。

JMXを介してリモートクライアントに一部の機能を公開するアプリケーションがありますが、ほとんどの場合、既存のセキュリティ機能で十分ですが、アプリケーションはセキュリティバックエンドとしてApacheShiroフレームワークを使用します。

私の問題は、サーバー側でクライアントデータを収集する方法がないことです。Shiroは、クライアント(サブジェクト)を識別する方法を必要としています。通常、実行中のスレッドはサブジェクトに関連付けられていますが、オンラインのJMXドキュメントには、リモートJMXのスレッドモデルに関する手がかりはあまりありません。

クライアントをスレッドに関連付けるにはどうすればよいですか、または相互作用するMBean内のクライアントデータを取得する方法はありますか?

4

1 に答える 1

0

さまざまな手法を研究して試した後、2つの勝者があります:

1- Java 7の一部となるClientContextと呼ばれる新機能:Java 7はまだ完成しておらず、ClientContextは下位互換性を壊します。

2- AccessControlContextへのShiroサブジェクトのアタッチ:これは私が選択したソリューションです。Shiroのデフォルトのサブジェクト取得メカニズムは、Javaのアクセス制御コンテキストを考慮していません。私はこれをテストするためにずっと前にテストを実行しましたが、それは機能しませんでした。これで理由がわかりました。デフォルトでは、SecurityUtils.getSubject()呼び出しは、取得したサブジェクトを現在呼び出しているスレッドにアタッチしますが、スレッドはクライアント間で共有できるため、このアプローチは役に立ちません。しかし、AccessControlContextははるかに強力であり、JMXはそれとうまく連携しているように見えます。アクセス制御コンテキスト(JMXAuthenticatorでのログイン時に認証されます)には、MBeanServerForwarderから、またはMBean内からでもアクセスできます。複数のクライアントがプリンシパルを取得してこれをテストしましたが、単純に機能します。

編集:現在のAccessControlContextにShiroサブジェクトをアタッチするにはどうすればよいですか?

1-ビルダークラスSubject.Builderを使用して、アタッチされていないShiroサブジェクトを作成します。

2-ユーザーを認証します(Shiroサブジェクトのログイン方法などを使用)

3-プライベートクレデンシャルとしてShiroサブジェクトを含むシングルトンセットを使用して、可変JAASサブジェクトを作成します。

4-基盤となるJavaセキュリティシステムの対象となるJAASを提供します(たとえば、JMXAuthenticatorの認証方法内で対象を返します)

このアプローチを簡素化するためにヘルパークラスを作成できます。Shiroサブジェクトに代わって(承認などのために)アクションを実行する必要がある場合は、AccessControlContextからアクションを取得し、Subject.execute...メソッドの1つを使用します。これは、プロキシまたはフォワーダー(MBeanServerForwarderなど)の内部で実行できます。

于 2011-02-06T13:03:48.423 に答える