2010-03-06 6 views
5

L'authentification JMS à fichier plat est facile à configurer sur Glassfish (voir http://docs.sun.com/app/docs/doc/821-0027/aeofg?a=view).Authentification JMS Glassfish (fichier plat)

Le problème est la partie client. J'écris un client Java autonome pour accéder à mes ressources JMS (ConnectionFactory et Destination) via JNDI. Comment faire passer un nom d'utilisateur et un mot de passe à JMS de ce client

je l'ai déjà essayé plusieurs choses telles que:

1) Ajout de ces informations d'identification dans le InitialContext

context.addToEnvironment(InitialContext.SECURITY_PRINCIPAL, "username"); 
context.addToEnvironment(InitialContext.SECURITY_CREDENTIALS, "password"); 

2) En utilisant les paramètres de nom d'utilisateur et mot de passe JMS dans l'usine de connexion

connectionFactory.createConnection(); 

Cependant, aucune de ces méthodes ne fonctionne.

Quand je lance le programme, je reçois juste:

com.sun.messaging.jms.JMSSecurityException: [C4084]: Échec de 
l'authentification de l'utilisateur : user=guest, broker=localhost:7676(34576) 
at com.sun.messaging.jmq.jmsclient.ProtocolHandler.authenticate 
(ProtocolHandler.java:1084) 

Il continue d'essayer d'authentifier avec l'utilisateur « invité ».

Pour ce test, j'ai utilisé connection.NORMAL.deny.user=* comme règle d'autorisation (accesscontrol.properties).

La partie intéressante est que cette exception est levée, même avant que la connexion est obtenue Factore:

InitialContext context = new InitialContext(); 

ConnectionFactory connectionFactory = 
(ConnectionFactory)context.lookup("jms/middleware/factory"); 
/* The exception is thrown here, so authentication MUST have happened 
    before already (i.e. NOT in the createConnection(username, password) method) */ 

quelqu'un Hope connaît la réponse.

Un grand merci à l'avance

Cordialement,

Dinesh

Répondre

2

OK J'ai trouvé une solution de contournement, qui est de ne pas utiliser JNDI, mais à utiliser l'API JMS spécifique au fournisseur à la place, comme décrit http://weblogs.java.net/blog/kalali/archive/2010/03/02/open-mq-open-source-message-queuing-beginners-and-professionals-0

Le code final est:

com.sun.messaging.ConnectionFactory connectionFactory = new com.sun.messaging.ConnectionFactory(); 
QueueConnection queueConnection = connectionFactory.createQueueConnection("user01", "password01"); 

cette fois conduit à l'erreur

Error: [C4060]: Login failed: user=user01, broker=localhost:7676(53445) 

Ce qui est grand;)

Donc, solution fonctionne. Cependant, si quelqu'un sait comment réaliser ceci aussi avec JNDI ce serait encore mieux.