我试图将JBoss EAP 6.3 JMS-Bridge配置为在安全环境中工作。似乎根本不可能。
我的配置包括两个(相同的)JBoss EAP安装:称为提供者和消费者。 Provider定义队列,使用者使用netty连接工厂将其连接到本地队列。如果使用
禁用安全性,则配置正常<security-enabled>false</security-enabled>
一旦我激活安全性,消费者就无法构建桥梁。我通过指定:
在双方使用相同的安全域<security-domain>myDomain</security-domain>
我还尝试在桥接构建期间指定用户名/密码组合:
<jms-bridge name="...">
<source>
<connection-factory name="RemoteConnectionFactory" />
<user>USERNAME</user>
<password>secret</password>
<destination>jms/topic/whatever</destination>
</source>
...
</jms-bridge>
如果我没有指定用户名/密码,则会观察到Jboss EAP 6.3: HQ119031: Unable to validate user: null中描述的行为。如果我在JMS-Bridge的源配置中指定用户名,则异常是相同的,但我看到指定的USERNAME而不是null:
ERROR HQ122010: Failed to connect JMS Bridge: javax.jms.SecurityException: HQ119031: Unable to validate user: USERNAME]
at org.hornetq.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:399)
....
....
Caused by: HornetQException[errorType=SECURITY_EXCEPTION message=HQ119031: Unable to validate user: USERNAME]
安全域也配置为与EJB3 RMI一起使用,USERNAME是有效用户。
我错过了什么吗?禁用消息传递安全性不是我们的选择。所以如果有任何解决方法,请帮忙!
亲切的问候,
西蒙
答案 0 :(得分:1)
当我们在同一台机器上运行两个JBosses的本地测试时,我们遇到了同样的错误(HQ119031:无法验证用户)。在我们的例子中,问题是我们使用“远程”JBoss中的add-user脚本创建了用户,但脚本实际上是在客户端JBoss中创建了用户。为什么?因为我们设置了JBOSS_HOME变量并且脚本使用了该变量。我们删除了变量,问题就解决了。
因此,我建议仔细检查您正在使用的用户是否实际列在远程JBoss配置中的application-users.properties文件中。
现在我们有一个使用安全性的JMS桥。这是一个描述:
客户端(发件人)是JBoss EAP 6.3.3。在standalone / domain.xml中的消息传递子系统配置中,我们有:
<bridges>
<bridge name="myBridge">
<queue-name>jms.queue.MyQueueLocal</queue-name>
<forwarding-address>jms.queue.MyQueue</forwarding-address>
<retry-interval>5000</retry-interval>
<retry-interval-multiplier>2.0</retry-interval-multiplier>
<failover-on-server-shutdown>false</failover-on-server-shutdown>
<use-duplicate-detection>true</use-duplicate-detection>
<confirmation-window-size>10000000</confirmation-window-size>
<user>myUser</user>
<password>passwdInClear</password>
<static-connectors>
<connector-ref>netty-remote</connector-ref>
</static-connectors>
</bridge>
</bridges>
其中一个<connectors>
是:
<netty-connector name="netty-remote" socket-binding="remote-jms"/>
在<security-realm name="ApplicationRealm">
中,我们有以下几行。秘密值是您使用add-user脚本创建用户时看到的Base64哈希。
<server-identities>
<secret value="cEBzc3cwcmQ="/>
</server-identities>
然后在<socket-binding-group>
内我们有:
<outbound-socket-binding name="remote-jms">
<remote-destination host="myRemoteHost" port="5445"/>
</outbound-socket-binding>
在远程JBoss(也称为EAP 6.3.3)上,standalone / domain.xml显示了MyQueue队列的常用消息传递配置和声明。
在此服务器上,我们使用add-user创建了用户帐户。该用户属于ApplicationRealm
和guest
组。
当然,客户端JBoss上的发件人应用程序会向MyQueueLocal发送消息。
答案 1 :(得分:0)
您是否尝试过在桥接上下文中添加用户名和密码?
<jms-bridge name="myBridge">
<source>
<connection-factory name="jms/RemoteConnectionFactory"/>
<destination name="jms/queue/bridgeQueue"/>
<user>guest</user>
<password>pass</password>
<context>
<property key="java.naming.factory.initial" value="org.jboss.naming.remote.client.InitialContextFactory"/>
<property key="java.naming.provider.url" value="remote://xx.xx.xx.xx:xxxx"/>
<property key="java.naming.security.principal" value="guest"/>
<property key="java.naming.security.credentials" value="pass"/>
</context>
</source>
<target>
<connection-factory name="java:/ConnectionFactory"/>
<destination name="jms/queue/testQueue"/>
</target>
<quality-of-service>AT_MOST_ONCE</quality-of-service>
<failure-retry-interval>500</failure-retry-interval>
<max-retries>1</max-retries>
<max-batch-size>500</max-batch-size>
<max-batch-time>500</max-batch-time>
<add-messageID-in-header>true</add-messageID-in-header>
</jms-bridge>