2013-11-25 23 views
4

我只是試圖創建一個JMS持久訂閱服務器,並使用HornetQ服務器。但我得到的執行拋出異常用戶:空沒有權限=地址上的CREATE_DURABLE_QUEUE

Connection Factory Looked Up : HornetQConnectionFactory [serverLocator=ServerLocatorImpl [initialConnectors=[TransportConfiguration(name=netty, factory=org-hornetq-core-remoting-impl-netty-NettyConnectorFactory) ?port=5445&host=localhost], discoveryGroupConfiguration=null], clientID=null, consumerWindowSize = 1048576, dupsOKBatchSize=1048576, transactionBatchSize=1048576, readOnly=false] 
Topic Looked Up : HornetQTopic[TestTopic] 
Connection Created : [email protected] 
CLient ID set : DSubCliID 
Session Created : HornetQSession->DelegatingSession [session=ClientSessionImpl [name=ab3a1be5-559f-11e3-bd5b-87d0be06d2c5, username=null, closed=false, factory = ClientSessionFactoryImpl [serverLocator=ServerLocatorImpl [initialConnectors=[TransportConfiguration(name=netty, factory=org-hornetq-core-remoting-impl-netty-NettyConnectorFactory) ?port=5445&host=localhost], discoveryGroupConfiguration=null], connectorConfig=TransportConfiguration(name=netty, factory=org-hornetq-core-remoting-impl-netty-NettyConnectorFactory) ?port=5445&host=localhost, backupConfig=null], metaData=(jms-client-id=DSubCliID,jms-session=,)]@22eff179] 
javax.jms.JMSSecurityException: HQ119032: User: null doesnt have permission=CREATE_DURABLE_QUEUE on address {2} 
    at org.hornetq.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:388) 
    at org.hornetq.core.client.impl.ClientSessionImpl.internalCreateQueue(ClientSessionImpl.java:2021) 
    at org.hornetq.core.client.impl.ClientSessionImpl.createQueue(ClientSessionImpl.java:357) 
    at org.hornetq.core.client.impl.DelegatingSession.createQueue(DelegatingSession.java:298) 
    at org.hornetq.jms.client.HornetQSession.createConsumer(HornetQSession.java:782) 
    at org.hornetq.jms.client.HornetQSession.createDurableConsumer(HornetQSession.java:547) 
    at org.hornetq.jms.client.HornetQSession.createDurableConsumer(HornetQSession.java:527) 
    at DurableSubscriber.main(DurableSubscriber.java:38) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
Caused by: HornetQSecurityException[errorType=SECURITY_EXCEPTION message=HQ119032: User: null doesnt have permission=CREATE_DURABLE_QUEUE on address {2}] 
    ... 13 more 

看起來像一些權限問題。除了在hornetq-jms.xml中添加默認隊列和主題外,我沒有更改任何配置。在hornetq-configuration.xml

<queue name="TestQueue"> 
     <entry name="queues/TestQueue"/> 
    </queue> 

    <topic name="TestTopic"> 
     <entry name="topics/TestTopic"/> 
    </topic> 

安全配置如下 -

<security-settings> 
     <security-setting match="#"> 
     <permission type="createNonDurableQueue" roles="guest"/> 
     <permission type="deleteNonDurableQueue" roles="guest"/> 
     <permission type="consume" roles="guest"/> 
     <permission type="send" roles="guest"/> 
     </security-setting> 
    </security-settings> 

一切都是默認的。必須做些什麼才能創建一個持久的用戶?

+0

什麼'security'配置你的'將hornetq-configuration.xml'? – harsh

+0

@harsh更新了這個問題。 –

回答

7

看起來像createDurableQueue默認配置中缺少權限角色映射,請查看HornetQ持久訂購者示例代碼(它與安裝捆綁在一起)以進行所需配置。

總之,你可以嘗試以下附加配置:

<permission type="createDurableQueue" roles="guest"/> 
<permission type="deleteDurableQueue" roles="guest"/> 
+0

是的,工作。 TX! –

+1

我們不希望它在guest虛擬機上,以避免默認情況下利用弱點的攻擊。有人可以匿名連接到服務器,並無限創建隊列,直到服務器不可操作爲止。 確保您沒有將您的服務器打開到網絡。 –

+0

@Clebert何時纔會更新** hornetq-2.4.0.Beta1 **的文檔? Docs沒有JMS 2.0類,用戶手冊也沒有提及共享訂閱,這是JMS 2.0中引入的最重要的特性。 –

1

只需添加到苛刻的回答上面這是正確的答案BTW,我們也可以完全禁用安全性。

添加行

<security-enabled>false</security-enabled> 

hornetq-configuration.xml和去除<security-settings>也完全會做的伎倆。

更多信息here

1

將消息發送到隊列時,請不要忘記使用具有「guest」角色的用戶。要做到這一點,你需要編輯application-roles.properties並設置

sender_user =來賓