4

Spring なしで構成された JMX サーバーがあり、承認部分に Spring Security を実装しようとしています。(こちら、https://blogs.oracle.com/lmalventosa/entry/jmx_authentication_authorization ユース ケース 4 を参照してください。承認部分は含まれていません)

Spring Security を使用して Authorization 部分を実装したいと思います。

私の JMX オーセンティケーターでは、次のことを行います。

final List<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();
roles.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
final Authentication auth = new UsernamePasswordAuthenticationToken(credentialsArr[0], credentialsArr[1],
                        roles);
SecurityContextHolder.getContext().setAuthentication(auth);

そして、MBeans でそれを取得しようとし、それが正しく渡されたことを確認します (将来的には、Spring Annotations を追加してロールやメソッド呼び出しをチェックする予定です)。

final Authentication springAuth = SecurityContextHolder.getContext().getAuthentication();

問題は、標準の接続フローでは次のことです。

JMXServiceURL url = ...;
Map env = ...;
String[] creds = {"monitorRole", "mrpasswd", "FileRealm"};
env.put(JMXConnector.CREDENTIALS, creds);
JMXConnector cc = JMXConnectorFactory.connect(url, env);
MBeanServerConnection mbsc = cc.getMBeanServerConnection();

JMX コネクタを取得し、MBean サーバーに接続してメソッドを呼び出します。動作します。オーセンティケーターを通過し、Spring コンテキストを設定して、Mbean で取得します。

しかし、たとえば、Jconsole を使用して接続すると、Mbean で Spring コンテキストを取得できません。

継承可能なスレッド戦略を使用しています。

  1. JConsole やその他のコネクタを使用して接続するときに、MBean でもコンテキストを取得する方法はありますか?
  2. Spring を使用して JMX を実装すると、問題の解決に役立ちますか?
  3. 私のメイン フローは絶対確実ですか (MBean でコンテキストを取得できない可能性はありますか)? このフローは私にとって非常に重要なので、誰にでもわかるようにお願いしています。

どうもありがとう!

4

1 に答える 1

1

私はそれに興味を持っていて、私自身の結論を共有したかったので、私自身の質問に答えます(上記の数字とは関係ありません):

  1. JConsole (または JVisualVM) をローカルに (つまり、localhost に) 接続すると、JMX Authenticator を介さずにスレッドに直接接続するように見えます。私が見つけた唯一の回避策は、完全な URL (例: service:jmx:rmi:///jndi/rmi://10.45.32.112:3251/jmxrmi) で接続することでした。

  2. 常に機能するメカニズムの 1 つは、Java セキュリティ コンテキストです。JMXAuthenticator がサブジェクトを返す場合、Spring Security Context をそれに割り当てることができるため、メソッドを呼び出すときに (たとえば、呼び出しの前に実行されるアドバイスで) 確実に取得できます。私が得たこの返信を参照してください: http://forum.springsource.org/showthread.php?134327-JMX-Authentication-with-Spring-Security-%283-1-x%29

  3. 質問に記載されているフローが絶対確実かどうかはわかりません。しかし、次の仮定に基づいているようです。JMX 呼び出しごとに新しい接続を作成し、それを 1 回の呼び出しにのみ使用すると、Spring Security Context が正しく伝播されます。

それがあなたの人々を助けたことを願っています:-)

于 2013-03-11T07:57:47.977 に答える