2014-01-15 104 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");