用户权限和连接字符串

生产环境不要裸奔 MongoDB。

至少要做到:

  • 开启认证。
  • 给业务创建专用用户。
  • 不用 root 用户连接业务库。
  • 不把数据库端口直接暴露到公网。
  • 密码放到环境变量或密钥管理系统。

一、连接字符串格式

本地无认证连接:

mongodb://127.0.0.1:27017

带用户名密码:

mongodb://app_user:strong_password@127.0.0.1:27017/mongodb_tutorial?authSource=mongodb_tutorial

常见部分:

部分含义
app_user用户名
strong_password密码
127.0.0.1:27017MongoDB 地址
mongodb_tutorial默认连接数据库
authSource用户认证所在数据库

如果用户创建在 admin 数据库,authSource 就写 admin

二、创建业务用户

进入 mongosh 后切换业务数据库:

use mongodb_tutorial

创建用户:

db.createUser({
  user: "blog_app",
  pwd: passwordPrompt(),
  roles: [
    { role: "readWrite", db: "mongodb_tutorial" }
  ]
})

passwordPrompt() 会在命令行提示输入密码,比把明文密码写在命令里更安全。

三、连接业务库

mongosh "mongodb://blog_app:strong_password@127.0.0.1:27017/mongodb_tutorial?authSource=mongodb_tutorial"

实际项目里不要直接把密码写进代码。

可以放到环境变量:

MONGODB_URI=mongodb://blog_app:strong_password@127.0.0.1:27017/mongodb_tutorial?authSource=mongodb_tutorial

四、常见内置角色

角色作用
read只读
readWrite读写指定数据库
dbAdmin数据库管理
userAdmin用户管理
root超级权限

后端应用通常只需要业务库的 readWrite

不要用 root 账号跑业务服务。

五、Docker 学习环境里的认证

如果使用 Docker Hub 的 mongo 镜像,可以用环境变量初始化 root 用户:

docker run --name mongo-auth -d -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=example mongo:latest

连接:

mongosh "mongodb://root:example@127.0.0.1:27017/admin"

这适合本地学习认证流程。

生产环境还要考虑网络隔离、磁盘持久化、备份、监控和访问控制。