Spring连接IBM MQ报2035未授权错误的原因及疑问
IBM MQ连接2035认证失败问题分析
问题现象
IBM MQ调用失败,compcode '2' ('MQCC_FAILED'),reason '2035' ('MQRC_NOT_AUTHORIZED')。JMSWMQ2013: 为队列管理器'
'提供的安全认证无效,连接模式为'Client',主机名为'()'。
项目配置代码
配置类
@Bean public JmsTemplate jmsTemplate() throws JMSException { MQQueueConnectionFactory mqQueueConnectionFactory = mqQueueConnectionFactory(); UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = getUserCredentialsConnectionFactoryAdapter(mqQueueConnectionFactory); JmsTemplate jmsTemplate = new JmsTemplate(userCredentialsConnectionFactoryAdapter); jmsTemplate.setReceiveTimeout(Long.parseLong(receiveTimeout)); return jmsTemplate; } @Bean public MQQueueConnectionFactory mqQueueConnectionFactory() throws JMSException { MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory(); mqQueueConnectionFactory.setHostName(hostname); mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT); mqQueueConnectionFactory.setUserAuthenticationMQCSP(Boolean.parseBoolean(userMQCSPAuthValue)); mqQueueConnectionFactory.setChannel(channel); mqQueueConnectionFactory.setPort(port); mqQueueConnectionFactory.setQueueManager(queueManager); mqQueueConnectionFactory.setClientReconnectOptions(WMQConstants.WMQ_CLIENT_RECONNECT); mqQueueConnectionFactory.setClientReconnectTimeout(Integer.parseInt(reconnectTimeout)); return mqQueueConnectionFactory; } @Bean public UserCredentialsConnectionFactoryAdapter getUserCredentialsConnectionFactoryAdapter( MQQueueConnectionFactory mqQueueConnectionFactory) { UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter(); userCredentialsConnectionFactoryAdapter.setUsername(username); userCredentialsConnectionFactoryAdapter.setPassword(password); userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(mqQueueConnectionFactory); return userCredentialsConnectionFactoryAdapter; }
消息收发代码
TextMessage message = (TextMessage) jmsTemplate.sendAndReceive(destinationMq, session -> { TextMessage textMessage = session.createTextMessage(request); textMessage.setJMSCorrelationID(correlationId); textMessage.setJMSReplyTo(getMQ(replyToQueue)); return textMessage; });
服务器端日志
AMQ9557E: 队列管理器用户ID 'my system user id'初始化失败。说明:初始化用户ID 'my system user id'的调用失败,CompCode 2,Reason 2035。如果使用了MQCSP块,则MQCSP块中的用户ID为'username from property'。如果使用了用户ID流,则UID头中的用户ID为'my system user id',任何在用户采用前应用的CHLAUTH规则都会对此值进行区分大小写的评估。操作:纠正错误并重试。
已知事实
- 配置的用户名和密码正确,其他应用使用相同凭据可正常连接IBM MQ
已生效的临时解决方案
- 将
setUserAuthenticationMQCSP的参数值设置为false - 应用启动时设置系统属性:
System.property("user.name", "配置的用户名")
核心疑问
- 为什么上述两种临时解决方案能够生效?
- 为何连接IBM MQ时会使用系统用户ID进行认证?如何确保仅使用配置中传入的用户名和密码完成认证?
内容的提问来源于stack exchange,提问作者dope
相关产品推荐
相关产品推荐

