MongoDB 的用户名和密码是基于特天命据库的,而不是基于全体系统的,以是每个数据库 都须要设置密码,并且每个数据库都有一个 user 表来支撑这种机制。
这便是说 MongoDB 可以为每个数据库都建立权限认证,即可以指定某个用户可以访问到哪个数据库。
1. 开启权限认证
Mongo DB 默认是没有开启任何权限掌握的,我们可以通过命令参数 --auth,或者通过配置文件 mongod.conf 中 security: authorization: enabled 来开启。

# /etc/mongod.conf# 其它配置,见上一篇文章:# https://www.toutiao.com/article/7206237090173207080/?log_from=1bcd70521abfb_1677891079401security: #开启账号密码登录验证办法 authorization: enabled
在开启 authorization 之前,要先创建干系用户并授予权限(至少要创建一个管理用户的账号,这样就可以在开启后用它来创建用户),不然在开启认证之后,连接上做事会创造一个数据库也访问不了。
2. 创建超级管理员 root
在 MongoDB 中 admin 数据库是一个非常特殊的数据库,这个数据库的用户可以访问 MongoDB 中的所有数据库。
现在为 MongoDB 的 admin 数据库添加一个用户:root 超级管理员,角色:root,密码:root。该 root 用户,用于关闭数据库的操作。
创建 root 用户的步骤如下。
创建超级管理员
2.1 连接mongosh mongodb://192.168.1.193:27017
2.2 查看所有数据库
# 可以看到有 admin 数据库show dbs
2.3 进入 admin 数据库,创建 root 用户
use admindb.createUser({user:"root", pwd: "root", roles:[{role: "root", db: "admin"}]})
2.4 查看是否创建成功
show users # 或 db.getUsers()
再创建一个用于管理账号的用户:admin,该用户的 role 是 userAdminAnyDatabase。 admin 用户用于管理账号,不能进行关闭数据库等操作。
创建所有数据库的管理员
use admindb.createUser({user:"admin", pwd: "admin", roles:[{role: "userAdminAnyDatabase", db: "admin"}]})# 查看是否创建成功show users
除了可以设置数据库的超级管理员以外,还可以给每个数据库设置单独的管理员,它只有操作单独数据库的权限。
各个不同的数据库之间,可以创建有一个或多个账户;各数据库之间的账户、密码都是独立的,不能相互访问。
4.1 创建一个数据库先创建一个数据库,用于演示如何为该数据库创建单独的管理员。
创建 DB# 在没有插入数据前 show dbs 不会显示该 mydbuse mydb
创建 collection(相称于 mysql 的表)
# 创建后再用 show dbs 就可以看到 mydb 了db.createCollection("product")
查看凑集(相称于查看 mysql 数据库中的表)
# 这时 mydb 数据库中还没有任何表/凑集show collections
插入文档(对应在 mysql 的表中插入行)
db.product.insertOne({code: 1, name: "足球", price: 99.8, num: 60})db.product.insertMany([ {code: 2, name: "笔", price: 9.8, num: 50}, {code: 3, name: "鞋", price: 199, num: 40}])
查看插入的数据
db.product.find()
4.2 为 mydb 创建管理员
接下来为 MongoDB 的 mydb 数据库添加一个用户:dbAdmin 管理员,角色 role: "dbOwner",代表数据库所有者的角色,拥有该数据库最高权限,密码也设为 dbAdmin。
用该账号可以为自己的数据库创建用户等统统行为。
特殊把稳,一定要切换到所在数据库上去创建该用户,不然创建到 admin 数据库,就达不到效果了。
查看 mydb 数据库上的用户# 切换到该数据库use mydb# 创建前,查看当前 DB上的 usershow users
创建 owner 账号
# 创建 owner 账号db.createUser({user:"dbAdmin", pwd: "dbAdmin", roles:[{role: "dbOwner", db: "mydb"}]})# 查看 mydb 上的用户show users
创建单一数据库的管理员
5. 重启 MongoDB 开启认证
确保配置文件中 authorization 设置为 enabled。
# /etc/mongod.confsecurity: #开启账号密码登录验证办法 authorization: enabled
关闭 mongodb,重新开启
mongod --shutdown --dbpath /data/mongo/dbmongod --config /etc/mongod.conf --fork
不用账号直接登录的结果:报须要权限认证
开启后未登录无法查看
用 dbAdmin 登录 mydb 的结果:只可以访问 mydb,看不到 admin 等其它无权限的数据库
可以访问 mydb
小结
本文我们按权限从大到小,创建了
超级管理员 root(root 角色),管理所有数据库的数据库管理员 admin(userAdminAnyDatabase 角色),以及单个数据库的超级管理员 dbAdmin(dbOwner 角色),实在 MongoDB 还内置了很多其它的角色,可以让我们做到更细的权限掌握,比如只读、读写等,但做法都和上面的一样,相信大家只要理解了本文分享的方法就一定能轻松搞定的。