IBM MQ是常用的企业级消息中间件,pymqi是其Python客户端库,开发过程中经常会遇到返回码为2035的授权错误,该错误表示当前用户没有执行对应操作的权限。错误可能出现在连接队列管理器、访问队列、发送消息等多个场景中,需要结合MQ的权限配置和pymqi的连接参数逐一排查。

2035错误的常见原因
2035错误的核心原因是权限校验不通过,常见的触发场景有以下几种:
- 连接队列管理器时使用的用户不在MQ的授权用户列表中
- 通道配置开启了强制认证,但客户端提供的用户凭证不符合要求
- 对目标队列没有配置对应的操作权限,比如没有放消息或者取消息的权限
- MQ的认证配置中限制了客户端的IP或者用户来源
2035错误的解决步骤
1. 确认pymqi连接参数是否正确
首先检查pymqi连接时是否指定了正确的用户和密码,如果MQ没有开启匿名访问,必须提供合法的用户凭证。以下是基础的pymqi连接示例代码:
import pymqi
# 队列管理器名称
qmgr_name = "QM1"
# 通道名称
channel = "CHL1"
# 连接地址和端口
host = "127.0.0.1"
port = "1414"
# 连接字符串
conn_info = f"{host}({port})"
# 用户名和密码,若MQ不需要认证可省略
user = "mquser"
password = "mqpass"
try:
# 创建连接选项
opts = pymqi.CD()
opts.ChannelName = channel.encode()
opts.ConnectionName = conn_info.encode()
# 设置用户凭证
security_opts = pymqi.SCO()
security_opts.UserId = user.encode()
security_opts.Password = password.encode()
# 连接队列管理器
qmgr = pymqi.QueueManager(qmgr_name, opts, security_opts)
print("连接队列管理器成功")
qmgr.disconnect()
except pymqi.MQMIError as e:
print(f"连接失败,错误码:{e.reason}")
2. 检查MQ的用户权限配置
如果连接参数正确,需要登录MQ服务器检查对应用户的权限。可以通过MQSC命令查看和配置权限:
# 进入MQSC交互模式,QM1为队列管理器名称 runmqsc QM1 # 查看用户mquser的所有权限 DISPLAY AUTHREC USER(mquser) # 给用户mquser配置连接队列管理器的权限 SET AUTHREC USER(mquser) OBJTYPE(QMGR) AUTHADD(CONNECT) # 给用户mquser配置访问队列Q1的放消息权限 SET AUTHREC USER(mquser) OBJTYPE(QUEUE) OBJNAME(Q1) AUTHADD(PUT) # 给用户mquser配置访问队列Q1的取消息权限 SET AUTHREC USER(mquser) OBJTYPE(QUEUE) OBJNAME(Q1) AUTHADD(GET) # 退出MQSC END
3. 调整通道认证配置
如果通道开启了额外的认证规则,也可能导致2035错误。可以检查通道的认证配置,或者临时调整通道的认证策略:
runmqsc QM1 # 查看通道CHL1的认证配置 DISPLAY CHANNEL(CHL1) AUTHENTICATION # 若不需要强制认证,可以调整通道认证模式(生产环境谨慎操作) ALTER CHANNEL(CHL1) CHLTYPE(SVRCONN) AUTHENTICATION(NONE) END
IBM MQ权限管理最佳实践
为了避免频繁出现权限问题,同时保障MQ的安全性,建议遵循以下权限管理实践:
- 遵循最小权限原则,只给用户分配必要的操作权限,不要授予过高的权限
- 为不同的业务场景创建独立的用户,不要多个应用共用同一个MQ用户
- 定期审计MQ的用户权限,及时回收不再使用的用户权限
- 生产环境不要关闭通道认证,建议使用独立的认证服务或者系统用户认证方式
- 对队列管理器、队列、通道等不同对象分别配置权限,避免权限过度集中
常见问题排查表
以下是2035错误排查时的常见检查项对照表:
| 检查项 | 排查方法 | 解决方向 |
|---|---|---|
| 连接用户是否存在 | 查看MQ用户列表,确认用户已创建 | 创建合法用户并加入MQ用户组 |
| 用户是否有队列管理器连接权限 | 执行DISPLAY AUTHREC USER(用户名) OBJTYPE(QMGR) | 通过SET AUTHREC命令添加CONNECT权限 |
| 通道是否允许当前用户连接 | 查看通道的认证配置和限制规则 | 调整通道认证规则或者添加用户白名单 |
| 目标队列权限是否齐全 | 查看队列的AUTHREC配置 | 添加对应的PUT、GET等必要权限 |
按照以上步骤排查和调整后,pymqi的2035授权错误通常可以得到解决。如果问题仍然存在,可以查看MQ的错误日志,日志中会有更详细的权限校验失败信息,帮助进一步定位问题。