2010-03-06 80 views
5

平面文件JMS身份驗證很容易在Glassfish上設置(請參閱http://docs.sun.com/app/docs/doc/821-0027/aeofg?a=view)。Glassfish JMS(平面文件)身份驗證

問題是客戶端部分。我正在編寫一個獨立的Java客戶端,通過JNDI訪問我的JMS資源(ConnectionFactoryDestination)。

如何從該客戶端向JMS傳遞用戶名和密碼?

我已經試過幾件事情,如:

1)將這些憑證中的InitialContext

context.addToEnvironment(InitialContext.SECURITY_PRINCIPAL, "username"); 
context.addToEnvironment(InitialContext.SECURITY_CREDENTIALS, "password"); 

2)連接工廠

connectionFactory.createConnection(); 

使用JMS的用戶名和密碼參數但是,這些方法都沒有工作。

當我運行該程序,我只是得到:

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) 

因此,它會一直嘗試用「guest」用戶進行身份驗證。

對於此測試,我使用connection.NORMAL.deny.user=*作爲權限規則(accesscontrol.properties)。

有趣的部分是factore獲得連接,即使在此之前拋出異常:

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) */ 

希望有人知道答案。

很多感謝

問候,

迪內希

回答

2

OK我找到了一個解決辦法,這是不使用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來實現這一點,那將會更好。