Spring JmsTemplate + Security

4
我刚刚重构了一些发布到JMS主题的代码,使用了Spring的JmsTemplate类,现在我收到一个异常,说明我没有通过身份验证。
以前,我创建了工厂,建立了连接,然后按照以下方式设置了会话:
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

请提供“确切”的异常信息,包括完整的堆栈跟踪。 - Bozho
2个回答

2
这里有几个选项...
- 之前设置的属性导致通道以管理员身份运行。为了获得相同的功能,您可以将通道的MCAUSER设置为QMgr正在运行的任何ID(在UNIX上通常为mqm,在Windows上为MUSR_MQADMIN)。 完成。 就这么简单。 - 是的,这意味着连接到该通道的任何人都是管理员。 另一方面,这不比以前更糟,正如您之前的代码所示,它能够正常工作。 - 您仍然可以使用Spring并按照此论坛帖子中描述的方式传递ID和密码。 请记住,密码实际上没有被检查。 除非使用通道出口验证它,否则接受传入的任何ID。 要了解有关通过客户端连接的WMQ安全性的更多信息,请参见Hardening WebSphere MQ演示文稿。 如果您想确保对QMgr的访问安全,请将MCAUSER设置为低特权用户ID,执行setmqaut命令以授权该ID的组,并锁定所有其他通道(例如SYSTEM.AUTO.*和SYSTEM.DEF.*),以便它们无法运行。

0

我在本地 Windows 机器上运行 WebSphere 并连接到 Unix 机器上的 MQ 服务器。对我来说只有第三个选项有效。从控制台设置用户ID没有效果。我尝试了 mqm 和 MUSR_MQADMIN 两个选项。

//使用用户名和密码创建连接 QueueConnection connection = factory.createQueueConnection("mqm","mqm");


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接