我在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");
我想我必须在其他地方更改凭据,但我不知道在哪里。即使它有效,它也会强制客户端进行身份验证?我的意思是,我的客户没有其他方式可以在没有凭据的情况下订阅我的主题吗?
答案 0 :(得分: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 \ instances \ imqbroker \ etc)中,将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");