さまざまな手法を研究して試した後、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など)の内部で実行できます。