IBM MQ用户认证失效:配置未校验用户名且报2035未授权错误
IBM MQ连接2035未授权错误排查与修复
问题描述
配置Spring+Camel连接IBM MQ的XML后,系统未校验指定用户名,同时抛出错误:
IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2035' ('MQRC_NOT_AUTHORIZED')
原配置代码:
<bean id="mq01" class="org.apache.camel.component.jms.JmsComponent"> <property name="configuration" ref="jmsConfiguratione0l" /> </bean> <bean id="jmsConfiguration01" class="org.apache.camel.component.jms.JmsConfiguration"> <property name="connectionFactory" ref="credentialsConnectionFactory01"/> <property name="username" value="userid" /> <property name="password" value="userid" /> <property name="testConnectionOnStartup" value="true" /> <property name="concurrentConsumers" value="5" /> </bean> <bean id="credentialsConnectionFactory01" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter"> <property name="targetConnectionFactory" ref="jndiFactoryBean01" /> <property name="username" value="userid" /> <property name="password" value="userid" /> </bean> <bean id="jndiFactoryBean01" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiTemplate" ref="jndiTemplate01"/> <property name="jndiName" value="mq1"/> </bean> <bean id="jndiTemplate01" class="org.springframework.jndi.JndiTemplate"> <property name="environment"> <props> <prop key="java.naming.factory.initial">com.sun.jndi.fscontext.RefFSContextFactory</prop> <prop key="java.naming.provider.url">${binding.url}</prop> <prop key="java.naming.security.authentication">simple</prop> <prop key="java.naming.security.principal">userid</prop> <prop key="java.naming.security.credentials">userid</prop> </props> </property> </bean>
问题原因
- 配置引用拼写错误:
JmsComponent中引用的jmsConfiguratione0l是拼写错误,实际正确的bean ID是jmsConfiguration01,导致Camel组件未加载到正确的JMS配置。 - 多层认证配置冲突:同时在
JmsConfiguration、UserCredentialsConnectionFactoryAdapter、JndiTemplate中配置了用户名密码,可能导致认证信息传递混乱,MQ服务器无法获取正确的校验凭证。 - MQ端权限不足:指定的
userid未被授予连接队列管理器、访问目标队列的权限。
修复方案
1. 修正配置引用错误
将JmsComponent中的ref值改为正确的jmsConfiguration01。
2. 统一认证配置
保留UserCredentialsConnectionFactoryAdapter的用户名密码配置,移除JmsConfiguration和JndiTemplate中的重复认证参数,避免冲突。
3. 配置MQ端权限
登录IBM MQ控制台,给userid授予以下权限:
- 连接队列管理器的
CONNECT权限 - 访问目标队列的
PUT/GET权限(根据业务需求) - 测试环境可临时加入
mqm用户组,生产环境遵循最小权限原则
修正后的配置示例
<bean id="mq01" class="org.apache.camel.component.jms.JmsComponent"> <property name="configuration" ref="jmsConfiguration01" /> </bean> <bean id="jmsConfiguration01" class="org.apache.camel.component.jms.JmsConfiguration"> <property name="connectionFactory" ref="credentialsConnectionFactory01"/> <property name="testConnectionOnStartup" value="true" /> <property name="concurrentConsumers" value="5" /> </bean> <bean id="credentialsConnectionFactory01" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter"> <property name="targetConnectionFactory" ref="jndiFactoryBean01" /> <property name="username" value="userid" /> <property name="password" value="userid" /> </bean> <bean id="jndiFactoryBean01" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiTemplate" ref="jndiTemplate01"/> <property name="jndiName" value="mq1"/> </bean> <bean id="jndiTemplate01" class="org.springframework.jndi.JndiTemplate"> <property name="environment"> <props> <prop key="java.naming.factory.initial">com.sun.jndi.fscontext.RefFSContextFactory</prop> <prop key="java.naming.provider.url">${binding.url}</prop> <prop key="java.naming.security.authentication">simple</prop> </props> </property> </bean>
内容的提问来源于stack exchange,提问作者DummyGuy
相关产品推荐
相关产品推荐

