后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载本文基于 FerretDB 官方 v1.21 版本发布说明深入讲解该版本引入的实验性SCRAM-SHA-1/SCRAM-SHA-256认证机制如何通过--test-enable-new-auth启用、如何用createUser创建用户并完成带认证的连接并结合当前仓库源码剖析 SCRAM 握手在saslStart/saslContinue中的实现细节。同时梳理该版本对upsert与 capped collection 清理逻辑的修复以及 v1.x 末期到 v2.0 的架构演进背景。读完本文你将掌握 FerretDB 认证模式的基本原理、启用方式与排查思路。版本背景为什么 v1.21 需要新的认证机制FerretDB 一直以 MongoDB 协议兼容为使命认证是其中至关重要的一环。在 v1.21 之前FerretDB 主要依赖外部数据库PostgreSQL/SQLite自身的账号体系来模拟 MongoDB 的用户认证这在很多场景下体验割裂用户管理命令支持有限、凭据无法由 FerretDB 独立管理。v1.21 是 1.x 系列的重要节点官方在该版本中加入了实验性的SCRAM-SHA-1/SCRAM-SHA-256认证机制。SCRAMSalted Challenge Response Authentication Mechanism是 RFC 5802/7677 定义的挑战-响应认证协议也是 MongoDB 原生驱动默认使用的认证方式。FerretDB 引入该机制后可以让驱动以与 MongoDB 一致的方式完成认证握手从而显著提升兼容性。需要说明的是该功能在 v1.21 中标记为实验性需要显式开启后续版本v1.24 及 v2.x在此基础上进一步演化最终成为默认认证路径。本文以 v1.21 发布说明为主线同时结合当前仓库中可验证的源码与测试进行佐证。启用实验性认证模式v1.21 中新认证模式默认关闭需要通过专用开关显式打开。官方文档见 version-v1.24 的 flags 文档明确给出了对应关系命令行 Flag环境变量默认值--test-enable-new-authFERRETDB_TEST_ENABLE_NEW_AUTHfalse启用方式很简单任选其一# 通过命令行 flag ferretdb --test-enable-new-authtrue # 通过环境变量 FERRETDB_TEST_ENABLE_NEW_AUTHtrue ferretdb注意事项该 flag 在 v1.21 时期属于测试用途的隐藏参数可能不会出现在--help输出中开启后FerretDB 将自行管理用户账号并解锁更多用户管理命令只有在此模式下才支持在连接串中使用createUser创建的用户凭据完成 SCRAM 认证。在 Docker Compose 部署场景中典型配置如下Postgres 后端services: postgres: image: postgres environment: - POSTGRES_USERusername - POSTGRES_PASSWORDpassword - POSTGRES_DBferretdb volumes: - ./data:/var/lib/postgresql/data ferretdb: image: ghcr.io/ferretdb/ferretdb:1 restart: on-failure ports: - 27017:27017 environment: - FERRETDB_POSTGRESQL_URLpostgres://username:passwordpostgres:5432/ferretdb - FERRETDB_TEST_ENABLE_NEW_AUTHtrue - FERRETDB_SETUP_USERNAMEuser - FERRETDB_SETUP_PASSWORDpass - FERRETDB_SETUP_DATABASEferretdb networks: default: name: ferretdb其中FERRETDB_SETUP_USERNAME/FERRETDB_SETUP_PASSWORD/FERRETDB_SETUP_DATABASE用于在首次启动时创建初始账号与初始数据库这一能力在 v1.22 的用户设置功能中被正式完善。启动后用docker compose up -d即可通过mongosh mongodb://user:passferretdb/ferretdb完成带认证的连接。创建用户并连接启用新认证模式后就可以使用标准的createUser命令创建用户。其命令入口在仓库 internal/handler/msg_createuser.go 中实现核心逻辑是解析文档、补充默认角色后调用documentdb.CreateUser将用户持久化到后端。// mongosh 中创建用户 use admin db.runCommand({ createUser: user, pwd: pass, roles: [{ role: clusterAdmin, db: admin }, { role: readWriteAnyDatabase, db: admin }], mechanisms: [SCRAM-SHA-256] // 可选默认机制为 SCRAM-SHA-256 })关于mechanisms参数从源码看msg_createuser.go 中会先移除客户端传入的mechanisms字段再交给底层存储处理实际生效的机制以存储层返回为准。仓库中的集成测试如 integration/auth/create_user_test.go覆盖了EmptyMechanism、BadAuthMechanism等用例验证了机制为空、机制非法等边界行为integration/auth/usersinfo_test.go 则验证了usersInfo返回的机制列表既有纯SCRAM-SHA-256的情况也有[SCRAM-SHA-1, SCRAM-SHA-256]的组合情况。创建完成后即可在连接串中直接使用该用户凭据连接mongosh mongodb://user:passlocalhost:27017/?authSourceadminauthMechanismSCRAM-SHA-256新认证模式同时支持以下用户管理命令dropUser/dropAllUsersFromDatabase删除用户updateUser修改用户密码与角色usersInfo查询用户信息与支持的认证机制。这些命令分别对应仓库 internal/handler/msg_dropuser.go、msg_dropallusersfromdatabase.go、msg_updateuser.go、msg_usersinfo.go 中的实现。SCRAM 认证握手源码级流程解析新认证模式的核心是一次标准的 SCRAM 挑战-响应握手客户端与服务器之间通过saslStart和saslContinue两个 MongoDB 命令完成。下面结合仓库源码说明四个阶段。阶段一saslStart开启对话入口在 internal/handler/msg_saslstart.go 的saslStart方法中从请求中读取mechanism若不为SCRAM-SHA-256则返回ErrMechanismUnavailable见 msg_saslstart.go。也就是说v1.21 实验模式下握手阶段实际以SCRAM-SHA-256为默认机制解析payload中的客户端首条消息client-first从中提取用户名通过documentdb_api_internal.ScramSha256GetSaltAndIterations向后端获取该用户的 salt 与迭代次数生成服务端首条消息server-first连同conversationId一并返回客户端。阶段二saslContinue验证客户端证明客户端收到 server-first 后计算客户端证明client proof再次通过saslContinue提交。入口在 internal/handler/msg_saslcontinue.go从连接上下文中取出之前保存的 SCRAM 会话Conv若无会话则报ErrProtocolErrorNo SASL session state found调用conv.ClientFinal解析客户端最终消息计算认证消息auth message调用documentdb_api_internal.AuthenticateWithScramSha256校验证明成功后返回服务端签名server signature作为 server-final完成双向认证。阶段三会话状态管理Conv结构体定义在 internal/util/scram/conv.go 中它完整保存 client-first、server-first、client-final、server-final 四类消息并用sync.RWMutex保证并发安全。值得注意的是会话不可重启——每个连接必须新建一个Conv实例且非当前对话的重复消息会被拒绝。连接级会话存放在conninfo中由saslContinue在结束时清理。阶段四SCRAM 消息解析消息解析在 internal/util/scram/message.go 的parseMessage中实现其安全校验值得关注客户端非cer长度不得小于 16 字节服务端 salts长度不得小于 12 字节且推荐使用 28 字节与 DocumentDB 创建的用户凭据保持一致否则会打印告警日志迭代次数i不得小于 4096防止弱迭代导致的口令爆破风险仅支持cbiws即n,,的 base64 编码即不支持 channel binding属性顺序需符合 RFC 5802 第 5.1 节的规定。scram包的整体定位在 internal/util/scram/scram.go 的包注释中有明确说明Package scram provides an implementation of SCRAM-SHA-256 subset即实现的是 SCRAM-SHA-256 子集。兼容性细节从 internal/handler/msg_hello.go 可以看到hello命令会返回saslSupportedMechs: [SCRAM-SHA-256]而 internal/handler/msg_getparameter.go 中authenticationMechanisms参数的返回值为[SCRAM-SHA-1, SCRAM-SHA-256]这正是 v1.21 发布说明所称支持两种机制的组合体现。本版本的缺陷修复upsert处理重构修复过滤字段被忽略的问题v1.21 对update与findAndModify命令中的upsert处理进行了重构修复了upsert: true时过滤字段query 字段被错误忽略、未拼接到新文档的问题。仓库中的集成测试可以佐证该修复覆盖的行为例如 integration/query/findandmodify_test.go 中的TestFindAndModifyCommandUpsert表驱动测试UpsertNoSuchDocumentNoIdInQuery: { command: bson.D{ {query, bson.D{{ $and, bson.A{ bson.D{{v, bson.D{{$gt, 0}}}}, bson.D{{v, bson.D{{$lt, 0}}}}, }, }}}, {update, bson.D{{$set, bson.D{{v, 43.13}}}}}, {upsert, true}, }, lastErrorObject: bson.D{ {n, int32(1)}, {updatedExisting, false}, }, },该用例验证了查询条件不存在任何匹配文档、且 query 中没有_id时的 upsert 行为。UpsertExpressionKeyquery 使用_id: {$exists: false}、UpsertDocumentKeyquery 使用嵌套文档_id等用例则验证了不同类型的查询键在 upsert 时被正确保留。update 命令侧的类似场景由 integration/update_field_test.go 覆盖其中通过find结果比对确认了 upsert 生成的_id及字段内容。capped collection 清理逻辑改进v1.21 同时改进了 capped collection固定大小集合的清理逻辑当集合只配置了size参数、未配置max选项时删除旧文档的逻辑现在能正确处理。此前该场景下文档删除行为存在偏差此次修复保证了按大小限制滚动淘汰旧文档的语义符合预期。注capped collection 在 FerretDB 中的支持状态可在 website/docs/migration/compatibility.md 的兼容性矩阵中查询如convertToCapped、cloneCollectionAsCapped尚未实现create支持等。展望v2.0 的架构变革v1.21 发布时官方明确表示1.x 的迭代目标——提供生产可用的 MongoDB 开源替代品、收集多场景反馈——已经阶段性达成而性能是房间里的大象。v2.0 作为架构级的分水岭将彻底改变底层架构以换取大幅的性能与兼容性提升当前仓库v2系列正是这一演进的结果。对于计划从 MongoDB 迁移或正在评估 FerretDB 的用户官方建议关注版本升级路径见 website/docs/migration/migrating-from-v1.md迁移前的兼容性预检见 website/docs/migration/premigration-testing.md。小结启用实验认证--test-enable-new-authtrue或FERRETDB_TEST_ENABLE_NEW_AUTHtrue创建用户使用createUser命令配合dropUser、updateUser、usersInfo等命令管理账号连接在连接串中直接携带用户名密码按 MongoDB 驱动习惯指定authMechanismSCRAM-SHA-256原理完整的 SCRAM 四阶段握手由saslStart/saslContinue驱动底层scram包负责消息解析与会话状态安全校验nonce 长度、salt 长度、迭代次数下限在 internal/util/scram/message.go 中严格把关。v1.21 是 FerretDB 认证体系走向成熟的起点从实验性 SCRAM 支持到 v1.22 的用户初始化设置、v1.24 的 SQLite 认证支持直至 v2 中认证成为默认能力——这条演进脉络清晰地展示了 FerretDB 如何一步步把认证这一 MongoDB 兼容性的关键拼图补齐。赞分享后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载相关推荐EMQX Dashboard JSON API 的 SCRAM-SHA-256 挑战-响应认证接入指南EMQX Dashboard JSON API 的 SCRAM SHA 256 挑战 响应认证接入指南 本指南介绍 EMQX 5.x Dashboard JSO后端物联网消息队列通信EMQX Dashboard 登录启用 SCRAM-SHA-256 挑战-响应认证从密码登录到 SCRAM 的安全迁移指南EMQX Dashboard 登录启用 SCRAM SHA 256 挑战 响应认证从密码登录到 SCRAM 的安全迁移指南 EMQX Dashboard 的后端物联网消息队列通信MongoDB用户认证终极指南Robo 3T快速配置SCRAM-SHA-256加密MongoDB用户认证终极指南Robo 3T快速配置SCRAM SHA 256加密 在现代数据库管理中 MongoDB用户认证机制 是保障数据安全的重要屏障数据库客户端桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
电阻点焊工艺全解析:从熔核形成到缺陷排查 在焊装车间里待久了,你会习惯一种节奏:机器人手臂带着焊钳快速落在钣金上,咚的一声,火花一闪,零点几秒结束,然后移向下一个点。一个焊点就这样诞生了。有统计说,一台白车身上有四千到六千个这样… · 2026/9/23 14:00:27
ZSvirt国产化迁移实战:Windows虚拟机兼容性与PoC落地指南 1. 为什么这次 PoC 不是“换个软件试试”,而是国产化迁移的临门一脚ZSvirt 这个名字最近半年在政企和金融行业的运维群里出现频率陡增,但多数人还停留在“听说它能跑虚拟机”的模糊认知里。我上个月接手一个省级政务云平台的国产化替代评估任务ÿ… · 2026/9/23 14:00:27
使用 Bazel 模块化集成 Skia:外部客户端构建指南 图形学 【免费下载链接】skia Skia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions. 项目地址: https://gitcode.com/gh_mirrors/ski/skia 点击查看 免费下载 导读
Skia 不仅提供… · 2026/9/23 14:00:27
图的遍历:广度优先BFS 图的遍历:广度优先BFS
DFS是一条路走到黑,BFS则像水波纹——从起点开始,一圈一圈向外扩散。先访问距离1的邻居,再访问距离2的邻居……层层推进。
一、什么是BFS?
BFS(Breadth-First Search)= 逐层扩展,先近后远。
想象你往平静的水面扔一块石头: 第1圈波纹到达距离… · 2026/9/23 14:45:26
从零实现三层BP神经网络:反向传播与XOR分类实战 简介:这是一个使用Python从零实现三层BP神经网络的完整代码包,面向机器学习初学者、算法研究者及需要做回归/分类实验的开发者。资源以12个文件组织,包含6个Python源码(如BPNN、GradientDescent及测试脚本)、3个编译后… · 2026/9/23 14:45:26
全差分运放FDA选型与PCB设计实战指南 简介:本资源是一份面向电子工程师、模拟电路设计初学者及高校相关专业学生的硬件技术深度解析文档,聚焦全差分运算放大器(FDA)的核心原理与工程实践。内容系统覆盖引言、电压定义、噪声抑制机制、输出摆幅优势、谐波失真控制、基本… · 2026/9/23 14:45:26
CNN-LSTM混合模型实现网络入侵检测实战 简介:本资源是一个面向网络安全工程师、高校安全方向研究者及深度学习初学者的实战型入侵检测项目,聚焦于利用CNN与LSTM模型提升网络流量异常识别能力,解决传统规则引擎难以应对新型未知攻击的痛点。压缩包共1231个文件,主体为753… · 2026/9/23 14:45:26
Buck变换器小信号建模与环路补偿:LTspice从传递函数到PI参数落地 简介:《Buck 变换器的建模与仿真》是一份电力电子技术方向的 Word 文档资料,面向电气工程、自动控制等专业学生及电源设计入门者,系统梳理了单电压环 Buck 变换器的建模与仿真流程。资源包内共 1 个 docx 文件,压缩后大小约 708KB… · 2026/9/23 14:45:25
BP、RBF与PSO-RBF神经网络回归预测对比:从调参到优化实战 简介:本资源面向机器学习与深度学习入门及进阶学习者,聚焦数据预测这一典型任务,系统对比BP神经网络、RBF神经网络以及经粒子群优化算法(PSO)改进的RBF网络三种模型的实现与效果。压缩包共9个文件,约87KB&a… · 2026/9/23 14:45:19
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29