错误HQ224018:创建会话失败: HornetQExceptionerrorType=SECURITY_EXCEPTION message=HQ119031:无法验证用户: null
当JBossEAP6.3服务器即将接收JMS消息时。我已经通过remoting
子系统成功地对用户进行了身份验证,那么为什么用户是null呢?如何克服这个错误?
发布于 2014-10-16 23:59:46
EAP文档将您预订到:
(...)将allowClientLogin设置为true (.)如果希望HornetQ使用传播的安全性进行身份验证,那么也可以将authoriseOnClientLogin设置为true。
但是由于HORNETQ-883 bug,您必须关闭消息传递的安全性:
<hornetq-server>
<!-- … -->
<security-enabled>false</security-enabled>
<!-- … -->
</hornetq-server>
发布于 2017-07-27 11:04:20
简而言之,如果客户机从JEE容器中连接,并且不需要提供连接到的凭据(当调用factory.createConnection()
时),则使用InVM
连接器获取连接。JMS在打开到InVM的连接时不需要凭据(因为调用者在JVM实例中,因此具有名称),但仍然为远程JMS客户端提供安全性。连接器和ConnectionFactories配置在standalone.xml
的urn:jboss:domain:messaging
子系统中。
否则,如果不使用启用安全性的InVM连接器,则可能需要在[jboss-home]/bin
中运行add-user
脚本,以便将客户端凭据添加到appilcation-users.properties
文件,并在通过远程可用工厂连接的远程和InVM客户端调用factory.createConnection(username, pwd)
时提供这些凭据。
血淋淋的细节
在我们的JBoss EAP6.4实例中,远程连接(JVM之外)需要保持安全,以便适当地指定<security-settings>
for HornetQ。因此,JMS指示使用它配置连接器的安全性级别。
<hornetq-server>
<connectors>
<!-- additional connectors here -->
...
<in-vm-connector name="in-vm" server-id="0"/>
</connectors>
<jms-connection-factories>
<connection-factory name="InVmConnectionFactory">
<connectors>
<connector-ref connector-name="in-vm"/>
</connectors>
<entries>
<!-- JNDI bindings here -->
<entry name="java:/ConnectionFactory" />
</entries>
</connection-factory>
...
</jms-connection-factories>
因此,在JMS客户机中应用标准连接锅炉板:
InitialContext context = new InitialContext();
javax.jms.ConnectionFactory factory = (ConnectionFactory) context.lookup("java:/ConnectionFactory");
在创建连接时:
javax.jms.Connection connection = factory.createConnection();
事务JMS
对于连接到JMS的容器中的事务连接,我们的InVM
ConnectionFactory配置如下:
<jms-connection-factories>
...
<pooled-connection-factory name="hornetq-ra">
<transaction mode="xa"/>
<connectors>
<connector-ref connector-name="in-vm"/>
</connectors>
<entries>
<entry name="java:/JmsXA"/>
</entries>
</pooled-connection-factory>
</jms-connection-factories>
获取事务处理的JMS ConnectionFactory,如下所示:
InitialContext context = new InitialContext();
javax.jms.ConnectionFactory factory = (ConnectionFactory) context.lookup("java:/JmsXA");
https://stackoverflow.com/questions/26420490
复制相似问题