基于Tomcat容器时server.xml中MQ连接工厂指定用户名被忽略问题
1 直接报错:CHLAUTH规则无匹配放行
你使用的通道名为MYCHANNEL,但从DIS CHLAUTH(*) ALL返回结果来看,现有通道认证规则仅覆盖DEV.ADMIN.SVRCONN、DEV.APP.SVRCONN、SYSTEM.*类通道,没有针对MYCHANNEL的放行规则,最终请求会匹配到全局兜底的ADDRESS(*)规则,该规则配置为USERSRC(NOACCESS),因此所有对MYCHANNEL的连接都会被直接拦截。
2 server.xml中配置的testuser未生效原因
分为两类常见场景,其中第二类属于应用实现问题:
(1)MQ资源配置属性名错误
IBM MQ官方MQQueueConnectionFactoryFactory在Tomcat Resource配置中,用于传入认证用户的属性名为user,而非你写的username。username属于不被识别的无效属性,会被直接忽略,导致配置的testuser未生效。
(2)应用代码实现问题
如果你的应用从JNDI获取MQQueueConnectionFactory实例后,调用的是无参的createConnection()方法,无论ConnectionFactory是否配置了用户名密码,MQ客户端都会自动使用当前操作系统的运行用户(也就是Tomcat容器的启动用户tomcat/root)作为CLNTUSER发送给MQ服务端。只有显式调用createConnection("testuser", "cfpass")才会使用传入的用户名密码进行认证。
- 首先添加
MYCHANNEL的CHLAUTH放行规则,参考命令:
DEFINE CHLAUTH(MYCHANNEL) TYPE(ADDRESSMAP) ADDRESS(*) USERSRC(CHANNEL) CHCKCLNT(REQUIRED)
该规则允许所有地址对MYCHANNEL发起连接,使用客户端传入的用户进行后续身份校验,匹配你当前CONNAUTH强制校验客户端密码的配置。
2. 修正server.xml中两个MQ连接工厂的配置,将username="testuser"改为user="testuser"。
3. 检查应用的JMS连接获取逻辑:如果使用无参createConnection(),确认ConnectionFactory的属性配置正确;或者显式传入用户名密码调用带参方法。
内容的提问来源于stack exchange,提问作者faraamknight

