Аутентификация Glassfish JMS (плоский файл)

Аутентификацию JMS с плоским файлом легко настроить на Glassfish (см. http://docs.sun.com/app/docs/doc/821-0027/aeofg?a=view).

Проблема в клиентской части. Я пишу автономный Java-клиент для доступа к своим ресурсам JMS (ConnectionFactory и Destination) через JNDI.

Как передать имя пользователя и пароль в JMS от этого клиента?

Я уже пробовал несколько вещей, таких как:

1) Добавление этих учетных данных в InitialContext

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

2) Использование параметров имени пользователя и пароля JMS в фабрике соединений

 connectionFactory.createConnection();

Однако ни один из этих методов не работает.

Когда я запускаю программу, я просто получаю:

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)

Таким образом, он продолжает пытаться аутентифицироваться с пользователем «гость».

Для этого теста я использовал connection.NORMAL.deny.user=* в качестве правила разрешения (accesscontrol.properties).

Интересно то, что это исключение выбрасывается еще до того, как будет получен коэффициент соединения:

 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) */

Надеюсь, кто-нибудь знает ответ.

Спасибо заранее

С уважением,

Динеш


person Dinesh Bolkensteyn    schedule 06.03.2010    source источник


Ответы (1)


Хорошо, я нашел обходной путь, который состоит в том, чтобы не использовать JNDI, а вместо этого использовать API JMS для конкретного поставщика, как описано в http://weblogs.java.net/blog/kalali/archive/2010/03./02/open-mq-open-source-message-queuing-beginners-and-professionals-0

Окончательный код:

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

Что на этот раз приводит к ошибке

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

Что здорово ;)

Итак, обходной путь работает. Однако, если кто-то знает, как добиться этого с помощью JNDI, было бы еще лучше.

person Dinesh Bolkensteyn    schedule 06.03.2010