尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

EMQX MQTT 文件传输(File Transfer)REST 接口的命名空间访问控制

发布时间:2026/9/24 14:46:05

资讯中心
01
ARTICLE

EMQX MQTT 文件传输(File Transfer)REST 接口的命名空间访问控制

EMQX MQTT 文件传输(File Transfer)REST 接口的命名空间访问控制
后端物联网消息队列通信【免费下载链接】emqxThe most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles项目地址https://gitcode.com/gh_mirrors/em/emqx点击查看免费下载本篇文章聚焦 EMQX 中 MQTT 文件传输File Transfer功能的一组安全变更文件列表与下载相关的 REST 接口现在仅对全局非命名空间Dashboard 用户与 API Key 开放命名空间namespace用户与 API Key 将无法再读取其命名空间之外客户端上传的文件。文章将结合 changes/ee/fix-18315.en.md 变更记录与 emqx_ft 模块源码说明接口定义、权限边界、调用链与升级影响帮助读者理解并适配这一访问控制策略。背景MQTT 文件传输与文件管理 REST 接口EMQX 的 MQTT 文件传输File Transfer功能允许客户端通过 MQTT 协议以分段segment方式上传/下载文件并支持通过 REST API 对已上传文件进行查询与下载。文件管理相关的 HTTP 接口定义在 emqx_ft_api.erl 中路径前缀为file_transfer路径方法说明/file_transfer/filesGET分页列出文件支持游标following与limit/file_transfer/files/:clientid/:fileidGET按客户端 ID 与文件 ID 查询指定传输的文件信息/file_transferGET / PUT读取 / 更新文件传输配置转发至/configs/file_transfer上述接口均由namespace() - file_transfer见 emqx_ft_api.erl标识其 API 命名空间并声明scopes() - ?SCOPE_CONNECTIONS绑定连接相关权限范围。本次变更changes/ee/fix-18315.en.md的核心内容是文件列表与下载相关 REST 接口仅对全局非命名空间Dashboard 用户和 API Key 开放。命名空间用户与 API Key 将无法读取其命名空间之外客户端上传的文件。变更内容解读原变更记录原文MQTT File Transfer file listing and download REST endpoints are now available only to global (non-namespaced) Dashboard users and API keys. Namespaced users and API keys can no longer read files uploaded by clients outside their namespace.将其拆解为两个层面全局global用户与 API Key不受影响仍可完整调用文件列表与下载接口读取集群内任意客户端上传的文件命名空间namespaced用户与 API Key访问文件列表 / 下载接口时将受到限制无法读取其命名空间之外的客户端上传文件。什么是“命名空间”用户在 EMQX Dashboard 权限体系中管理员admin用户记录会携带命名空间信息。从 emqx_dashboard_admin.erl 源码可见管理员记录的namespace字段默认取?global_ns全局命名空间命名空间化namespaced的管理员在创建时会写入所属命名空间且源码中明确存在changing_namespace_is_forbidden的校验emqx_dashboard_admin.erl即命名空间一经创建不可修改命名空间化管理员被 RBAC 限制为不能变更系统级配置emqx_dashboard_admin.erl。因此本次变更实质上是在既有“全局 / 命名空间”管理员模型之上对文件传输的文件读取接口施加了命名空间隔离约束。文件列表与查询接口的源码级调用链1. 接口入口与开关检查两个文件接口在 schema 定义中均挂载了check_ft_enabled/2过滤器emqx_ft_api.erlschema(/file_transfer/files) - #{ operationId /file_transfer/files, filter fun ?MODULE:check_ft_enabled/2, get #{ tags ?TAGS, description ?DESC(file_list), parameters [ ref(following), ref(emqx_dashboard_swagger, limit) ], ... } };check_ft_enabled/2emqx_ft_api.erl先检查emqx_ft_conf:enabled()若文件传输功能未启用则返回503 SERVICE_UNAVAILABLEcheck_ft_enabled(Params, _Meta) - case emqx_ft_conf:enabled() of true - {ok, Params}; false - {503, error_msg(SERVICE_UNAVAILABLE)} end.2. 文件列表接口/file_transfer/files(get, ...)emqx_ft_api.erl解析查询参数后调用存储后端limit每页条数默认取emqx_mgmt:default_row_limit()following可选游标用于从指定位置继续分页游标非法时返回400 BAD_REQUEST。/file_transfer/files(get, #{query_string : QueryString}) - try Limit limit(QueryString), Query case maps:get(following, QueryString, undefined) of undefined - #{limit Limit}; Cursor - #{limit Limit, following Cursor} end, case emqx_ft_storage:files(Query) of {ok, Page} - {200, format_page(Page)}; {error, _} - {503, error_msg(SERVICE_UNAVAILABLE)} end catch error:{badarg, cursor} - {400, error_msg(BAD_REQUEST, Invalid cursor)} end.3. 单文件信息查询接口/file_transfer/files/:clientid/:fileid(get, ...)emqx_ft_api.erl以路径参数clientid、fileid组成传输标识查询指定文件信息文件不存在时返回404 FILES_NOT_FOUND/file_transfer/files/:clientid/:fileid(get, #{ bindings : #{clientid : ClientId, fileid : FileId} }) - Transfer {ClientId, FileId}, case emqx_ft_storage:files(#{transfer Transfer}) of {ok, Page} - {200, format_page(Page)}; {error, [{_Node, enoent} | _]} - {404, error_msg(FILES_NOT_FOUND)}; {error, _} - {503, error_msg(SERVICE_UNAVAILABLE)} end.4. 存储层文件查询分发emqx_ft_storage:files/0,1emqx_ft_storage.erl将查询请求按当前配置的存储后端local FS 或 S3分发files() - files(#{}). files(Query) - dispatch(files, [Query]). dispatch(Fun, Args) when is_atom(Fun) - {Type, Storage} backend(), apply(mod(Type), Fun, [Storage | Args]).存储后端的files/2回调约定定义在 emqx_ft_storage.erl由文件系统后端如 emqx_ft_storage_fs.erl与 S3 导出后端emqx_ft_storage_exporter_fs_api.erl实现。其中导出后端的 API spec 同样复用了emqx_ft_api:check_ft_enabled/2过滤器emqx_ft_storage_exporter_fs_api.erl确保下载/导出链路与列表接口保持一致的功能开关行为。5. 响应格式化查询结果通过format_page/1与format_file_info/1emqx_ft_api.erl组装为统一 JSON 结构files数组包含name、size、timestampRFC3339 格式、clientid、fileid、uri若文件带有元数据metadata则一并返回分页场景下额外携带cursor字段供客户端续页。变更对使用方的影响对全局用户与 API Key行为不变仍可调用GET /api/v5/file_transfer/files与GET /api/v5/file_transfer/files/{clientid}/{fileid}读取集群内全部客户端上传的文件现有脚本、告警系统与运维工具的调用无需调整。对命名空间用户与 API Key文件列表与下载接口的访问将受到命名空间边界约束无法读取其命名空间之外客户端上传的文件建议运维侧核查使用了命名空间化 Dashboard 用户或 API Key 的文件管理脚本确认其访问范围与预期一致若需要跨命名空间管理文件应改用全局非命名空间用户或 API Key并配合 Dashboard RBAC 做最小权限收敛。升级与兼容性提示该变更不改变 emqx_ft_schema.erl 中file_transfer的配置项结构与/file_transfer配置读写接口的转发逻辑emqx_ft_api.erl文件传输功能本身的 MQTT 侧上传、下载、断点续传能力不受影响变更仅收紧 REST 层的文件读取权限不涉及存储后端数据迁移升级后建议在测试环境用全局与命名空间两类凭据各验证一次文件列表与下载接口确认权限符合预期后再灰度到生产。小结本次变更changes/ee/fix-18315.en.md为 EMQX MQTT 文件传输的文件列表与下载 REST 接口引入了基于 Dashboard 命名空间的访问控制全局用户与 API Key 行为不变命名空间用户与 API Key 被限制在其命名空间范围内。从源码看该约束建立在既有全局 / 命名空间管理员模型之上贯穿 emqx_ft_api.erl 的接口定义与 emqx_dashboard_admin.erl 的命名空间管理逻辑属于对文件管理 API 的权限收紧不影响 MQTT 侧文件传输功能本身。赞分享后端物联网消息队列通信【免费下载链接】emqxThe most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles项目地址https://gitcode.com/gh_mirrors/em/emqx点击查看免费下载相关推荐EMQX 文件传输File Transfer over MQTTemqx_ft 应用配置与存储后端实战指南EMQX 文件传输File Transfer over MQTT emqx_ft 应用配置与存储后端实战指南 本指南以 apps/emqx_ft/READ后端物联网消息队列通信file-transfer-go革命性P2P文件传输工具的完整指南file transfer go革命性P2P文件传输工具的完整指南 在当今数字化时代 文件传输 已成为我们日常工作和生活中不可或缺的一部分。然而传统的文件后端前端即时通讯Tiptap 3.x 升级指南从 2 到 3 的完整迁移方案Tiptap 3.x 升级指南从 2 到 3 的完整迁移方案 Tiptap 3 迁移属于架构级破坏性升级包结构、扩展定义 API、存储作用域都变了不是能直前端富文本UI组件插件系统上一篇终极指南如何在多个设备间实现剪贴板内容同步下一篇效率翻倍pot-desktop快捷键全攻略4大场景操作指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。