Vernemq启用多认证授权插件仅vmq.diversity生效问题咨询
VerneMQ多认证插件共存问题解答
1. 双插件同时启用时仅vmq_diversity生效是否为默认行为
是VerneMQ的默认设计逻辑,但和“全插件依次校验直到出结果”的普遍预期存在差异:
VerneMQ的认证、授权钩子默认采用短路执行机制:多个插件注册同一类钩子(客户端连接认证、发布权限校验、订阅权限校验)时,会按插件加载顺序依次执行,只要任意一个插件返回明确的「允许」或「拒绝」结果,就会立刻终止整个校验链,不会再调用后续插件的校验逻辑。
你当前场景下,vmq_diversity默认加载顺序在vmq_passwd之前,对于PostgreSQL库中不存在的用户,vmq_diversity会直接返回「认证拒绝」结果,直接短路整个流程,导致后续的vmq_passwd根本没有机会校验文件中配置的用户,因此出现只有数据库用户能正常连接的现象。
2. 多认证插件共存的正确配置方法
要实现“文件用户、数据库用户分别由对应插件校验,任意插件校验通过即可连接”的效果,需要做两处配置调整,直接在docker-compose的environment段新增对应参数即可:
- 配置插件的「未匹配用户流转」逻辑
给vmq_diversity的PostgreSQL认证模块添加跳过不存在用户的配置,让插件查不到对应用户时不要直接返回拒绝,而是把请求转给下一个插件处理:
vmq_passwd默认就会对查不到的用户返回流转指令,不需要额外修改配置。- DOCKER_VERNEMQ_VMQ_DIVERSITY__AUTH_POSTGRES__PASSWD_SKIP_NOT_FOUND=on
如果需要两个插件的ACL授权规则同时生效,也要给对应授权模块配置类似的未匹配流转参数,避免某一个插件直接返回拒绝阻断流程。 - (可选)显式指定插件加载顺序
VerneMQ默认按插件名称的字典序加载插件,vmq_diversity字典序优先于vmq_passwd、vmq_acl,所以会先执行。如果需要调整校验优先级,可以显式指定插件加载顺序:
上述配置会优先校验文件用户、文件ACL规则,最后走数据库认证逻辑,前序插件未匹配到用户时自动流转到下一个插件。- DOCKER_VERNEMQ_PLUGINS__PLUGIN_ORDER=vmq_passwd,vmq_acl,vmq_diversity
配置修正提示:你当前配置中日志级别参数存在笔误,
DOCKER_VERNEMQ_LOG__CONSOLE__LEVEL=debuga末尾多了冗余字符a,会导致日志级别配置不生效,建议修正为debug,方便查看认证流程的调试日志排查问题。
3. 多插件启用时的校验顺序规则
VerneMQ多插件的校验顺序遵循以下规则:
- 插件加载优先级:
- 未显式配置时,按插件名称的字典序排序加载,钩子执行顺序和加载顺序完全一致
- 显式配置
plugins.plugin_order参数时,严格按照配置中填写的插件顺序执行
- 单个操作(连接/发布/订阅)的校验流程:
- 按顺序调用每个插件注册的对应钩子函数
- 若插件返回明确结果:允许(
ok)/拒绝({error, not_authorized}),立刻终止整个校验链,将结果返回给客户端 - 若插件返回
next,则继续调用下一个插件的对应钩子 - 若所有插件都返回
next,则最终根据allow_anonymous配置决定结果:配置为off时直接拒绝请求,配置为on时放行请求
内容的提问来源于stack exchange,提问作者Prince Odame
相关产品推荐
相关产品推荐

