1. 创建管理员用户1.1 创建用户1.2 开启权限验证1.3 重启MongoDB1.4 对比未开启权限VS开启权限2. 创建单个数据用户2.1 创建单个数据库用户管理员2.2 创建数据库管理员2.3 Navicat工具连接2.4 Pymongo连接3. 管理用户4. 创建一个不受访问限制的超级用户5. 查看创建的用户6. 修改密码7. 修改密码和用户信息8. 删除数据库用户9. 创建其他数据管理员10. 删除所有用户11. 权限说明11.1 角色11.2 权限Tips
1. 创建管理员用户
1.1 创建用户
创建了一个名为“ henggao”的用户,该用户对MongoDB中的所有数据库具有创建用户账户的权限,而不能管理数据库或执行其他管理任务。
# 1. 进入admin库 use admin # 2. 创建admin用户 db.createUser({ user: "henggao",pwd: "123456",roles:[{role: "userAdminAnyDatabase" , db:"admin"}]})
- 第一步是指定需要创建的“username”和“password”。
- 第二步是为用户分配角色。由于它需要是数据库管理员,在这种情况下,我们已分配给“ userAdminAnyDatabase”角色。该角色允许用户对MongoDB中的所有数据库具有管理特权。
- db参数指定admin数据库,它是MongoDB中一个特殊的元数据库,其中包含该用户的信息。
不开启权限的模式下,以认证方式进入
mongo -port 27017 -u "henggao" -p "123456" --authenticationDatabase "admin"
1.2 开启权限验证
启用权限验证,默认是不认证的非安全方式。
或者修改
/etc/mongod.conf
,最后一行添加vim /etc/mongod.conf
security: authorization: enabled # 开启以安全认证方式运行,默认是不认证的非安全方式
1.3 重启MongoDB
sudo systemctl restart mongod
1.4 对比未开启权限VS开启权限
未开启权限能查到数据库,开启权限查不到数据库
# 现在使用mongo命令推荐为mongosh mongo show dbs
- 未开启权限
- 开启权限
- 以admin用户henggao登录
mongo -port 27017 -u "henggao" -p "123456" --authenticationDatabase "admin"
- 或者先进入mongosh,再登录用户和密码
mongosh use admin db.auth("henggao","123456") show dbs
下面我都是开启权限下,用admin用户henggao登录测试。
mongosh -port 27017 -u "henggao" -p "123456" --authenticationDatabase "admin"
2. 创建单个数据用户
2.1 创建单个数据库用户管理员
创建了一个名为“ demoadmin”的用户,并且该用户仅对“ demo”数据库具有用户管理权限。
db.createUser( { user: "demoadmin", pwd: "password", roles:[{role: "userAdmin" , db:"demo"}]})
- 第一步是指定需要创建的“username” 和 “password”。
- 第二步是为用户分配一个角色,在这种情况下,由于需要成为数据库管理员,因此将其分配给“ userAdmin”角色。该角色允许用户仅对db选项中指定的数据库具有管理特权。
- db参数指定用户应对其具有管理特权的数据库。
插入一条数据,这时无论是admin数据库管理员用户
henggao
还是demo数据库用户管理员demoadmin
都不能成功插入数据。db.test.insertOne({name:"henggao",age:25})
2.2 创建数据库管理员
创建一个用户demodb,具有可写可读权限
db.createUser( { user: "demodb", pwd: "password", roles:[{role: "readWrite" , db:"demo"}]})
# 插入数据 db.test.insertOne({name:"henggao",age:25})
2.3 Navicat工具连接
使用Navicat连接测试,可以成功连接拿到数据
- 数据库:demo
- 用户名:demodb
- 密码:password
尝试用以下admin库的用户henggao连接失败。
使用demo库的demodb,可以连接数据库,但不可以访问数据。
2.4 Pymongo连接
from pymongo import MongoClient host = "192.168.92.145" port = 27017 user_name = "demodb" user_pwd = "password" # collection name db_name = "demo" coll_name = 'test' mongo_client = MongoClient(host, port) db = mongo_client[db_name] # 认证 db.authenticate(user_name, user_pwd) # 需要用的的表需要在认证后用client单独去关联 mongo_db = mongo_client[db_name] mongo_coll = mongo_db[coll_name] # 获取所有collections并打印,验证是否登录成功 coll_names = mongo_db.list_collection_names(session=None) print(coll_names)
也可以这样一下写完
from pymongo import MongoClient host = "192.168.92.145" port = 27017 user_name = "demodb" user_pwd = "password" # collection name db_name = "demo" coll_name = 'test' mongo_conn = MongoClient( 'mongodb://{}:{}@{}:{}/?authSource={}'.format(user_name, user_pwd, host, port, db_name)) # 需要用的的表需要在认证后用client单独去关联 mongo_db = mongo_conn[db_name] mongo_coll = mongo_db[coll_name] # 获取所有collections并打印,验证是否登录成功 coll_names = mongo_db.list_collection_names(session=None) print(coll_names)
在创建用户的时候可以根据需要多赋予几个权限
db.createUser( { user: "dbadmin", pwd: "abc123", roles: [ "readWriteAnyDatabase", "dbAdminAnyDatabase","clusterAdmin" ] } )
3. 管理用户
创建一个名为Mohan的用户,并且在多个数据库中分配了多个角色。在上面的示例中,他被授予对“ Marketing”数据库的只读权限,对“ Sales”数据库具有readWrite权限。。
db.createUser( { user: "Mohan", pwd: "password", roles:[ { role: "read" , db:"Marketing"}, role: "readWrite" , db:"Sales"} } ] })
4. 创建一个不受访问限制的超级用户
db.createUser( { user:"root", pwd:"pwd", roles:["root"] } )
5. 查看创建的用户
show users db.system.users.find() db.runCommand({usersInfo:"userName"})
6. 修改密码
use admin db.changeUserPassword("username", "xxx")
7. 修改密码和用户信息
db.runCommand( { updateUser:"username", pwd:"xxx", customData:{title:"xxx"} } )
8. 删除数据库用户
use admin db.dropUser('user001')
9. 创建其他数据管理员
// 登录管理员用户 use admin db.auth('admin','admin') // 切换至db001数据库 use db001 // ... 増查改删该数据库专有用户
10. 删除所有用户
- 非auth模式下启动
# 查看所有用户 db.system.users.find() # 删除所有用户 db.system.users.remove({})
11. 权限说明
11.1 角色
数据库用户角色:read、readWrite 数据库管理角色:dbAdmin、dbOwner、userAdmin 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager 备份恢复角色:backup、restore 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase 超级用户角色:root
11.2 权限
Read:允许用户读取指定数据库 readWrite:允许用户读写指定数据库 dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限 readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限 readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限 userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限 root:只在admin数据库中可用。超级账号,超级权限
Tips
- 和用户管理相关的操作基本都要在admin数据库下运行,要先use admin;
- 如果在某个单一的数据库下,那只能对当前数据库的权限进行操作;
- db.addUser是老版本的操作,现在版本也还能继续使用,创建出来的user是带有root role的超级管理员。