0

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

这是我的客户。您可以看到我选择使用一种“直接连接”而不是使用 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");

我想我必须在其他地方更改凭据,但我不知道在哪里。而且即使有效,也会强制客户端进行身份验证?我的意思是,如果没有凭据,我的客户就没有其他方法可以订阅我的主题吗?

4

1 回答 1

1

简短的回答:

1 - 在 imqbroker (glassfish3\mq\bin\imqusermgr.exe) 上创建一个用户。

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

长答案:

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

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

这将在 imqbroker 上创建一个由varhome特定用户名和密码指示的用户。

2 - 在 accesscontrol.properties 文件 (myDomain\imq\instances\imqbroker\etc) 中,将部分编辑为destination based access control

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

这将允许myUser消费myTopic和拒绝其他用户。您拥有的其余主题将继续允许所有用户使用它们。请注意,topic.*.consume.allow.user=*不替换topic.myTopic.consume.deny.user=*.

我的代码保持不变:

TopicConnection conn = connectionFactory.createTopicConnection("myuser", "mypass");
于 2014-01-20T21:57:26.733 回答