【问题标题】:Jboss EAP 6.3: HQ119031: Unable to validate user: USERNAMEJboss EAP 6.3:HQ119031:无法验证用户:USERNAME
【发布时间】:2015-01-01 21:46:37
【问题描述】:

我正在尝试配置 JBoss EAP 6.3 JMS-Bridge 以在安全环境中工作。似乎根本不可能。

我的配置由两个(相等的)JBoss EAP 安装组成:称它们为提供者和消费者。 Provider 定义了一个队列,consumer 使用 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 是一个有效的用户。

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

亲切的问候,

西蒙

【问题讨论】:

标签: security jboss jms jboss7.x


【解决方案1】:

当我们在同一台机器上使用两个 JBoss 运行本地测试时,我们遇到了同样的错误(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>
    
  • &lt;connectors&gt; 之一是:

    <netty-connector name="netty-remote" socket-binding="remote-jms"/>
    
  • &lt;security-realm name="ApplicationRealm"&gt; 内,我们有以下几行。秘密值是您在使用 add-user 脚本创建用户时看到的 Base64 哈希值。

    <server-identities>
        <secret value="cEBzc3cwcmQ="/>
    </server-identities>
    
  • 那么在&lt;socket-binding-group&gt; 内我们有:

    <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。

【讨论】:

    【解决方案2】:

    您是否尝试将用户名和密码添加到您的网桥上下文?

    <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>
    

    【讨论】:

    • 将上下文信息放入网桥源部分的配置中会导致尝试以与默认情况下网桥不同的方式创建 JNDI 上下文。所以我尝试了它并没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多