java - Spring JmsTemplate + 安全

标签 java security spring jms jmstemplate

我刚刚重构了一些发布到 JMS 主题的代码以使用 Spring 的 JmsTemplate 类,现在我收到一个异常,指出我未通过身份验证。

之前我创建了工厂,建立了连接,然后是 session 等,如下所示:

MQTopicConnectionFactory factory = new MQTopicConnectionFactory();
factory.setQueueManager(qMgr);   
factory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
factory.setHostName(hostname);
factory.setPort(listenerPort);
factory.setChannel(channel);
// setting username and password to be empty string ==> no authentication
connection = factory.createConnection("", "");   
...
connection.start();

我在 JmsTemplate 中看不到任何地方可以将用户名和密码设置为空字符串。我的配置如下所示:

<bean id="jmsFactory" class="com.ibm.mq.jms.MQTopicConnectionFactory">
    <property name="queueManager">
        <value>ACT01</value>
    </property>
    <property name="hostName">
        <value>xx.xx.xx.xx</value>
    </property>
    <property name="port">
        <value>15004</value>
    </property>
    <property name="transportType">
        <value>1</value>
    </property>
    <property name="channel">
        <value>CONDUCTOR.ACT01</value>
    </property>
</bean>

<bean id="impactJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory">
        <bean class="org.springframework.jms.connection.SingleConnectionFactory">
            <property name="targetConnectionFactory">
                <ref local="jmsFactory" />
            </property>
        </bean>
    </property>
</bean>

我也曾尝试将 jmsFactory 包装在 UserCredentialsConnectionFactoryAdapter 对象中,但无济于事:

<bean id="jmsConnectionFactory" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
    <property name="targetConnectionFactory" ref="jmsFactory"/>
    <property name="username" value=""/>
    <property name="password" value=""/>
</bean> 

堆栈跟踪:

Caused by: com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: The security authentication was not valid that was supplied for QueueManager 'LOROL' with connection mode 'Client' and host name 'xx.xx.xx.xx'. Please check if the supplied username and password are correct on the QueueManager you are connecting to
at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:531)
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:219)
at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:410)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:7855)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7331)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:276)
at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6055)
at com.ibm.mq.jms.MQTopicConnectionFactory.createTopicConnection(MQTopicConnectionFactory.java:114)
at com.ibm.mq.jms.MQTopicConnectionFactory.createConnection(MQTopicConnectionFactory.java:197)
at org.springframework.jms.connection.SingleConnectionFactory.doCreateConnection(SingleConnectionFactory.java:343)
at org.springframework.jms.connection.SingleConnectionFactory.initConnection(SingleConnectionFactory.java:290)
at org.springframework.jms.connection.SingleConnectionFactory.createConnection(SingleConnectionFactory.java:227)
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:184)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:461)
... 25 more
Caused by: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2035' ('MQRC_NOT_AUTHORIZED').
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:206)
... 37 more

最佳答案

这里有几个选项...

  • 您之前设置的属性导致 channel 以管理员身份运行。要获得相同的功能,您可以将 channel 的 MCAUSER 设置为运行 QMgr 的任何 ID(对于 UNIX 通常为 mqm,在 Windows 上为 MUSR_MQADMIN)。繁荣。完毕。 Bob 是你的叔叔。
  • 是的,这确实意味着连接到该 channel 的任何人都是管理员。另一方面,这并不比以前更糟,正如您以前的代码按其方式工作所证明的那样。
  • 您仍然可以使用 Spring 并按照 this forum post 中的描述传入 ID 和密码。 .请记住,实际上并未检查密码。除非您使用 channel 导出对其进行验证,否则您传入的任何 ID 都会按面值接受。

有关客户端连接的 WMQ 安全性的更多信息,请参阅 Hardening WebSphere MQ presentation .如果您想真正保护对 QMgr 的访问,您需要将 MCAUSER 设置为低权限用户 ID,执行 setmqaut 命令以授权该 ID 的组,然后锁定所有其他 channel ,如 SYSTEM.AUTO.* 和 SYSTEM。 DEF.* 所以他们无法运行。

关于java - Spring JmsTemplate + 安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3196966/

相关文章:

java - 无法在 Linux 中运行简单的 bash 命令,权限被拒绝

java - 策略模式的鸭子示例

java - Java 7 Update 21 的新 WebStart 行为

javascript - 我怎样才能隐藏我的 JavaScript 函数以便没有人可以窃取它们?

java - 在 Spring 中通过代理创建和初始化惰性类实例

java - 将字符串输出到系统输出的最快方法是什么?

java - 请求 facebook v2.2 api 与 scribe 进行授权

linux - 简单与神秘的用户名

java - 用于测试的 Spring bean Autowiring

spring - 启用 Spring Repositories cvc-complex-type.2.4.c :The matching wildcard is strict, 但找不到元素 jpa:repositories 的声明