后端物联网消息队列通信【免费下载链接】emqxThe most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles项目地址https://gitcode.com/gh_mirrors/em/emqx点击查看免费下载本篇技术指南聚焦 EMQX 5.10 中 Dashboard 登录用户与 API Key 的权限模型变更privilege scopesystem、user_management、api_key_management、sso_management不得与任何普通 scope 混合出现在同一显式 scope 列表中。读完本文你将理解这四条 scope 为何被视为管理员等价、新规则在 Dashboard 用户与 API Key 两个端点上的落地方式、边界情形空列表、mfa_management、namespaced admin如何处理以及升级后如何拆分历史遗留的混合 scope 列表。背景EMQX 的两类授权主体与 scope 目录EMQX 通过scope权限范围对两类主体做细粒度授权API Key调用 REST API 的长期凭证可持有的 scope 为通用目录connections、publish、monitoring 等Dashboard 登录用户登录 Web 控制台的账号除通用 scope 外还可持有 4 个仅限登录用户的 scopeuser_management、mfa_management、sso_management、api_key_management。全部 scope 名称以编译期宏的形式集中定义在 emqx_utils/include/emqx_api_key_scopes.hrl并通过 emqx_utils/src/emqx_scope_catalog.erl 提供静态目录与校验逻辑。该目录模块是纯数据、无运行时依赖同时被emqx_managementAPI Key 授权、/api_key_scopes端点和emqx_dashboard登录用户 scope 校验、/user_scopes端点消费。用户可见的通用 scope 共 10 个connections、publish、data_integration、access_control、gateways、monitoring、cluster_operations、system、audit、license见 common_scope_catalog/0。四条管理员等价的 privilege scope在 emqx_api_key_scopes.hrl 中定义了特权 scope 分组?PRIVILEGE_SCOPESScope 名称管理员等价的原因system覆盖/configs/*与/data/*可重写整个节点配置user_management可创建持有任意 scope 的登录用户api_key_management可签发持有任意 scope 的 API Keysso_management可轮换/替换 SSO 后端从源码结构看这四条 scope 的管理员等价推理链是持有其中任意一条即可通过被覆盖的管理面 API 间接获取或授予任意权限——例如持有user_management就能造出一个拥有完整目录的管理员账号。因此把它们与受限制的普通 scope 放在同一个显式列表中无法对账户产生任何有意义的限制只会造成看起来受限、实际等价管理员的虚假安全感。注意mfa_management虽然同样是仅限管理员admin-only的登录用户 scope但刻意被排除在 privilege 分组之外。它的语义是管理其他用户的 MFA无法供给用户、签发 Key 或改写配置不构成管理员等价因此允许与普通受限 scope 共存详见下文边界情形。新规则privilege scope 与普通 scope 互斥自本变更起Dashboard 用户端点与 API Key 端点拒绝同时包含 privilege scope 与普通 scope 的显式 scope 列表。规则可归纳为显式、非空的 scope 列表必须纯 privilege或纯非 privilege二选一列表为空[]或字段缺失undefined时不适用该规则——它们是历史遗留的不受限与拒绝一切语义而非显式混合列表校验失败时返回 HTTP 400错误消息形如Privilege scopes cannot be combined with other scopes. Privilege scopes present: system. Other scopes present: connections. Assign either privilege scopes alone (administrator-equivalent), or non-privilege scopes alone.该消息由 emqx_scope_catalog.erl 的check_privilege_scope_mutex/1生成其中通过partition_privilege_scopes/1将输入列表拆分为{Privilege, Other}两个子列表保持输入顺序再判断是否两侧都非空。源码实现互斥校验的核心逻辑核心逻辑集中在 emqx_utils/src/emqx_scope_catalog.erl%% 将 scope 列表拆分为 {Privilege, Other} partition_privilege_scopes(Scopes) when is_list(Scopes) - lists:partition(fun(S) - lists:member(S, ?PRIVILEGE_SCOPES) end, Scopes). %% 互斥校验undefined 与 [] 直接放行 check_privilege_scope_mutex(undefined) - ok; check_privilege_scope_mutex([]) - ok; check_privilege_scope_mutex(Scopes) when is_list(Scopes) - case partition_privilege_scopes(Scopes) of {[], _} - ok; %% 纯非 privilege {_, []} - ok; %% 纯 privilege {Priv, Other} - %% 混合拒绝 {error, Privilege scopes cannot be combined with other scopes. ...} end.从实现可以看到三个关键设计放行条件undefined字段缺失与[]显式空列表直接通过——分别对应历史不受限与拒绝一切语义纯 privilege 或纯非 privilege 均放行四个 privilege scope 彼此可以自由组合普通 scope 之间也照常组合错误信息带明细把 Privilege 与 Other 两组名称都拼进消息便于客户端直接定位需要拆分的内容。两个接入点Dashboard 用户与 API Key 的四层校验Dashboard 用户端点POST/PUT /users登录用户的 scope 写入校验链路位于 apps/emqx_dashboard/src/emqx_dashboard_api.erl采用多层校验、返回首个错误的策略validate_scope_names/1拒绝未知 scope 名防拼写错误与$denied注入validate_role_scope_compat/2非管理员角色不得持有 admin-only scopemaybe_check_privilege_mutex/2仅对全局命名空间?global_ns的管理员应用 privilege mutexnamespaced admin 豁免见下节。其中validate_login_user_scopes/3接收RawScopes与EffectiveScopes两个列表RawScopes是客户端实际提交的值EffectiveScopes是经过角色默认值物化后的值。mutex 只针对RawScopes执行这是有意设计——若省略scopes字段物化出来的管理员角色默认值本身就是一个 privilege 与普通 scope 的混合集但它应被当作不受限的隐式情况放行而非显式混合列表见 write_scope_intent/2 对keep/unset/{set, L}三种写入意图的归一化。API Key 端点POST/PUT /api_keysAPI Key 侧的校验在 apps/emqx_management/src/emqx_mgmt_api_api_keys.erl同样是四层、首错即返validate_publisher_scopes/2发布者角色兼容性validate_no_login_only_scopes/1API Key禁止持有任何登录用户专属 scope4 个 login-only scope 会被直接拒绝validate_scopes_in_catalog/1scope 必须存在于目录emqx_scope_catalog:check_privilege_scope_mutex(RawScopes)同样只针对客户端实际提交的RawScopes执行互斥校验。两类端点的共同原则是互斥规则作用于客户显式声明的意图而不是系统物化出的默认值。边界情形与豁免空列表与字段缺失scopes字段省略 → 走角色默认值物化mutex 不触发scopes: []→ 显式拒绝一切的 deny-all合法。测试用例t_user_non_explicit_lists_pass/1验证了这两种情况均放行见 apps/emqx_dashboard/test/emqx_dashboard_user_scopes_SUITE.erl。mfa_managementadmin-only 但不是 privilegemfa_management属于?ADMIN_ONLY_SCOPES仅管理员可持有但不在?PRIVILEGE_SCOPES中。因此[mfa_management, connections]✅ 合法可以与普通 scope 共存[mfa_management, system]❌ 拒绝system是 privilege scope。测试用例t_user_mfa_mgmt_not_privilege/1精确覆盖了这对组合见上文 SUITE 文件第 781-787 行。namespaced admin 豁免对于命名空间管理员namespaced adminmutex不适用RBAC 分发是其权威闸门会拦截 privilege scope 本可触达的变更面且命名空间角色的 scope 兼容校验已先行收窄了可用集合继续套用互斥会破坏既有合法组合。对应测试为t_ns_admin_exempt_from_privilege_mutex/1与回归用例t_ns_admin_still_rejects_forbidden_scope/1见 SUITE 第 789-821 行——豁免 mutex 的同时越界的 scope 仍会被 400 拒绝。测试验证矩阵apps/emqx_dashboard/test/emqx_dashboard_user_scopes_SUITE.erl 以 CT 用例完整覆盖了本规则用例验证内容t_user_privilege_only_lists_pass纯 privilege 列表放行含四条全组合t_user_nonprivilege_only_lists_pass纯非 privilege 列表放行t_user_mixed_lists_rejected五组混合列表全部 400 拒绝t_user_non_explicit_lists_pass字段省略 / 显式空列表放行t_user_mfa_mgmt_not_privilegemfa_management 与普通 scope 可共存、与 privilege 不可共存t_ns_admin_exempt_from_privilege_mutex命名空间管理员豁免t_user_update_privilege_mutexPUT 更新路径混合 400、拆分后 200t_user_legacy_mixed_record历史遗留混合记录的读/写行为升级与兼容性历史遗留的混合 scope 记录规则上线前写入的、已存储为混合 scope 集的用户/API Key 记录继续正常运行读取不受影响——校验只发生在写入路径。但存在一个升级注意点下次更新该记录时如果请求仍提交同样的混合列表会被 400 拒绝t_user_update_privilege_mutex与t_user_legacy_mixed_record均验证了这一点更新请求必须拆分列表才能成功要么只保留 privilege scope管理员等价要么只保留普通 scope受限二选一写入。例如某历史用户持有[system, connections]升级后做一次 PUT 更新时# 拆分方式一仅保留 privilege scope管理员等价 PUT /api/v5/users/u_legacy { role: administrator, scopes: [system] } # 拆分方式二仅保留普通 scope受限 PUT /api/v5/users/u_legacy { role: administrator, scopes: [connections] }同样地API Key 更新PUT /api/v5/api_keys/:name若携带混合列表也会被check_privilege_scope_mutex/1拒绝需按同一原则拆分。实操建议新建账户时明确二选一需要管理员等价能力就用纯 privilege 列表如[system]或四条 privilege 的组合需要最小权限就用纯普通 scope 列表升级前审计存量记录通过GET /api/v5/users与GET /api/v5/api_keys拉取现有scopes对同时含 privilege 与普通 scope 的记录制定拆分计划可借助 emqx_scope_catalog.erl 中partition_privilege_scopes/1的分组逻辑人工判别牢记 mfa_management 的定位它虽仅限管理员但不是 privilege scope可与普通 scope 共享显式列表遵循显式意图才受检省略scopes字段或传[]都不触发互斥校验前者回落到角色默认能力后者是 deny-all。这一规则从机制上杜绝了privilege scope 受限 scope这一自相矛盾的配置形态让 scope 列表的语义在写入时即保持自洽避免账户实际权限远超列表表象的安全隐患。赞分享后端物联网消息队列通信【免费下载链接】emqxThe most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles项目地址https://gitcode.com/gh_mirrors/em/emqx点击查看免费下载相关推荐atproto/oauth-scopesAT Protocol OAuth 作用域Scope解析与权限校验实战指南atproto/oauth scopesAT Protocol OAuth 作用域Scope解析与权限校验实战指南 本文以 atproto 仓库中 a后端社交EMQX API Keys 基于 Scope 的权限控制细粒度 API 访问管理实战指南EMQX API Keys 基于 Scope 的权限控制细粒度 API 访问管理实战指南 output文章 EMQX API Keys 基于 Scope 的后端物联网消息队列通信Hetty Scope API编程方式管理规则Hetty Scope API编程方式管理规则 引言突破手动配置的效率瓶颈 在网络安全测试与HTTP流量分析过程中如何精准界定测试范围Scope始终是网络安全应用安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
OpenSpec实践:基于OpenAPI的规范驱动开发与Mock服务生成 直接开写,不整虚的。OpenSpec这名字乍一看像某个开源规范文档,实际上它是一套以 OpenAPI Specification 为核心的规范驱动开发工作流工具。我最早接触它是因为团队里前后端接口文档对不上、Mock 数据全靠手写、前端联调一天问八遍“这个字段啥类型”&… · 2026/9/23 7:50:04
护宝贝源码跑不通?面试必问的3个性能优化坑,改完快10倍 护宝贝源码跑不通?面试必问的3个性能优化坑,改完快10倍 复制来的护宝贝项目代码,本地跑起来直接报错,或者页面加载卡成PPT,这种场景太常见了。很多人盯着控制台里的红色报错发呆,改一行崩一行,根本不知道从哪下手调。… · 2026/9/23 7:49:52
2017百度世界大会实战项目最佳实践指南 2017百度世界大会实战项目最佳实践指南 配置环境就卡半天,是不是你的常态?别急,这套2017百度世界大会实战项目的最佳实践能帮你彻底摆脱依赖地狱。 项目目标… · 2026/9/23 8:36:34
Wind金融终端实操指南:从基础操作到Python接口的高效工作流 开篇:为什么金融研究生的第一课,不是计量经济学,而是打开Wind如果你在券商、基金、银行或者任何一家正经的金融机构实习过,大概率会有这样的经历:带教老师丢给你一个任务——“把这个行业近五年的财务数据拉下来”&… · 2026/9/23 8:36:28
3类高清截图软件手写实现对比:解决项目搭建难 3类高清截图软件手写实现对比:解决项目搭建难 学会语法却不知怎么搭项目,这是很多开发者卡在从入门到精通路上的最大坎。尤其是涉及前端渲染、后端图像处理或跨平台工具开发时,想要 手写实现 一个稳定且 高清 的截图功能,光看文档根本不够。你盯着… · 2026/9/23 8:36:28
3步搞定november怎么读:一文搞懂发音原理与代码验证 3步搞定november怎么读:一文搞懂发音原理与代码验证 面试被问原理答不上来,真的会当场社死。特别是当面试官轻飘飘问一句“november怎么读”,你心里默念“诺纹伯”,结果张嘴变成“诺温伯”,瞬间尴尬。别慌,今天这篇文章不玩虚的,咱们… · 2026/9/23 8:36:28
Python配置验证最佳实践:Pydantic详解与应用 1. 为什么我们需要更好的配置验证方案在开发过程中,处理配置文件是每个工程师都会遇到的常规任务。从简单的JSON/YAML文件到复杂的环境变量管理,配置数据验证一直是个容易被忽视但又极其重要的问题。我见过太多项目因为配置验证不严谨导致的线上事故&… · 2026/9/23 8:36:22
C# WPF在MES系统中的架构设计与性能优化实践 1. 项目概述:基于C# WPF的大型MES系统架构解析这套MES系统是我在汽车零部件行业实施的一个典型工业级解决方案,采用WPF作为前端展示框架,后端整合了SCADA数据采集、实时看板、多产品线管理等核心功能。系统需要处理来自17条产线、200台设备的… · 2026/9/23 8:36:15
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29