2011-01-24 4 views
1

Je fais des études sur JMX depuis un moment, mais je suis coincé.Session client JMX

J'ai une application qui expose certaines fonctionnalités aux clients distants via JMX, bien que les fonctionnalités de sécurité existantes puissent être suffisantes dans la plupart des cas mon application utilise le framework Apache Shiro comme backend de sécurité.

Mon problème est que je ne sais pas comment collecter des données client sur les serveurs. Shiro a besoin d'un moyen d'identifier un client (sujet), normalement le thread d'exécution est associé à un sujet mais la documentation JMX en ligne ne donne pas beaucoup d'indices sur le modèle de thread de JMX distant.

Comment puis-je associer un client à un thread ou existe-t-il un moyen de récupérer des données client dans les MBeans interactifs? Après la recherche et l'essai de différentes techniques,

Répondre

0

Il y a deux gagnants:

1- Nouvelle fonctionnalité appelée ClientContext qui fera partie de Java 7: Java 7 n'est pas encore terminée, et ClientContext va casser la compatibilité ascendante.

2- Attachement de Shiro à AccessControlContext: C'est la solution que je choisis, le mécanisme de recherche par défaut de Shiro ne tient pas compte du contexte de contrôle d'accès de Java. J'ai fait un test il y a longtemps pour tester ça mais ça n'a pas marché. Maintenant, je sais pourquoi: par défaut, SecurityUtils.getSubject() appelle attache le Sujet récupéré au thread appelant en cours, mais cette approche est inutile puisque les threads peuvent être partagés entre les clients. Mais AccessControlContext est beaucoup plus puissant, et il semble que JMX joue bien avec; votre contexte de contrôle d'accès (qui est authentifié lors de la connexion à JMXAuthenticator) est accessible à partir d'un MBeanServerForwarder ou même à l'intérieur de votre MBean. J'ai testé cela avec plusieurs clients qui récupèrent leur principal, cela fonctionne simplement.

Éditer: Comment attacher Shiro sujet à l'actuel AccessControlContext?

1- Créez un sujet Shiro non attaché à l'aide de la classe de générateur Subject.Builder.

2- authentifier l'utilisateur (en utilisant la méthode de connexion du sujet Shiro, etc.)

3- Créer un sujet mutable JAAS avec un singleton contenant le sujet Shiro que les pouvoirs privés.

4- Fournir le sujet JAAS au système de sécurité Java sous-jacente (par exemple, retour le sujet dans une méthode d'authentification de JMXAuthenticator)

Une classe d'aide peut être créé pour simplifier cette approche. Lorsque vous avez besoin d'une action à effectuer pour le compte du sujet Shiro (pour autorisation, etc.), récupérez-la à partir de AccessControlContext et utilisez l'une des méthodes Subject.execute .... Cela peut être effectué dans un proxy ou un redirecteur (comme MBeanServerForwarder).

+0

@Farrukh Najmi Ajout d'une description détaillée de la façon dont je fais cela –