5

平面文件 JMS 身份验证很容易在 Glassfish 上设置(请参阅http://docs.sun.com/app/docs/doc/821-0027/aeofg?a=view)。

问题是客户端部分。我正在编写一个独立的 Java 客户端来通过 JNDI访问我的 JMS 资源(ConnectionFactory和)。Destination

如何从该客户端向 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) */

希望有人知道答案。

提前谢谢了

问候,

迪内什

4

1 回答 1

2

好的,我找到了一种解决方法,即不使用 JNDI,而是使用供应商特定的 JMS API,如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 来实现这一点,那就更好了。

于 2010-03-06T15:07:11.473 回答