2014-01-15 46 views
0

我在GlassFish服务器上配置了JMS主题,并且实现了一个客户端来订阅主题并打印它收到的消息。这工作正常。JMS主题为Glassfish上的订阅者提供身份验证

这是我的客户。您可以看到我选择使用某种“直接连接”而不是使用JNDI查找。

com.sun.messaging.ConnectionFactory connFactory = new com.sun.messaging.ConnectionFactory(); 
connFactory.setProperty(com.sun.messaging.ConnectionConfiguration.imqAddressList, "mq://localhost:7676/"); 
TopicConnection connection = connFactory.createTopicConnection(); 
TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); 
Topic topic = session.createTopic("myTopic"); 
TopicSubscriber subscriber = session.createSubscriber(topic); 
subscriber.setMessageListener(this); 
connection.start(); 

这样任何客户端都可以订阅我的主题。我现在想要的是找到一种方法来强制客户端在开始接收消息之前进行身份验证。 Glassfish上可能吗?

到目前为止,我已经试图改变GlassFish管理页面上的“默认JMS主机的凭据并传递我对创建连接设置新的凭据:

TopicConnection connection = connFactory.createTopicConnection("myuser", "mypass"); 

但这并没有工作。它适用,如果我通过默认的凭据:

TopicConnection connection = connFactory.createTopicConnection("admin", "admin"); 

我想我必须改变凭据的其他地方,但我不知道在哪里。即使它起作用,它也会迫使客户端进行身份验证?我的意思是,我的客户没有其他方式可以订阅我的主题而无需凭证?

回答

1

简短的回答:

1 - 创建于imqbroker的用户(glassfish3 \ MQ \ BIN \ imqusermgr.exe)。

2 - 编辑accesscontrol.properties文件(myDomain \ imq \ instances \ imqbroker \ etc)并设置哪个用户可以使用哪个主题。

龙答:

1 - 通过命令提示符下执行:

\glassfish3\mq\bin\imqusermgr add -varhome c:\glassfish3\glassfish\domains\myDomain\imq -u myuser -p mypass

这将创建varhome与特定的用户名和密码,表示对imqbroker的用户。

2 - 在accesscontrol.properties文件(myDomain的\ IMQ \实例\ imqbroker \等),编辑部分destination based access control以类似的东西:

topic.myTopic.consume.allow.user=myUser 
topic.myTopic.consume.deny.user=* 
topic.*.consume.allow.user=*

这将使myUser消耗myTopic和拒绝其他用户。其他主题将继续允许所有用户使用它们。请注意,topic.*.consume.allow.user=*不会取代topic.myTopic.consume.deny.user=*

我的代码保持不变:

TopicConnection conn = connectionFactory.createTopicConnection("myuser", "mypass");