Jboss EAP 6.3:HQ119031:无法验证用户:USERNAME

时间:2014-11-05 16:03:21

标签: security jboss jms jboss7.x

我试图将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是有效用户。

我错过了什么吗?禁用消息传递安全性不是我们的选择。所以如果有任何解决方法,请帮忙!

亲切的问候,

西蒙

2 个答案:

答案 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创建了用户帐户。该用户属于ApplicationRealmguest组。

  • 当然,客户端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>