Glassfish JMS(平面文件)身份验证
Posted
技术标签:
【中文标题】Glassfish JMS(平面文件)身份验证【英文标题】:Glassfish JMS (flat-file) authentication 【发布时间】:2011-01-24 11:01:02 【问题描述】:在 Glassfish 上很容易设置平面文件 JMS 身份验证(请参阅 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) */
希望有人知道答案。
在此先感谢
问候,
饭菜
【问题讨论】:
【参考方案1】:好的,我找到了一种解决方法,即不使用 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 来实现这一点,那就更好了。
【讨论】:
以上是关于Glassfish JMS(平面文件)身份验证的主要内容,如果未能解决你的问题,请参考以下文章
Glassfish 在领域身份验证中创建多个 http 会话
glassfish jdbcrealm身份验证中的受限页面未触发登录
Glassfish V3 LDAP 身份验证失败不显示表单错误页面
使用 WildFly 在 JMS 中进行 JAAS 身份验证:javax.jms.JMSSecurityException:HQ119032:用户:null 没有权限 = 在地址 2 上发送