目录
前言
1、生产环境,不建议MongDB开启auth认证。 联想自己公司,确实在登录mongdb的时候不需要用户名和密码。
如果不开启mongdb的auth认证,那么我们登录mongdb的时候不需要用户名和密码,且对数据库可以进行任何操作;
如果开启了mongdb的auth认证,那么我们登录mongdb的时候需要用户名和密码,才能对某个数据库进行操作;
2、如果想要真实的测试出mongdb的权限效果,建议使用mongdb命令客户端测试;datagripe不易于测试;
一、服务端auth认证与客户端auth验证
如果我们在服务端开启了auth认证,那么在客户端访问数据库的时候就需要进行auth验证。
1、服务端开启auth认证的方式
方式一:在conf文件中配置(推荐)
auth=true
方式二:添加启动参数
启动mongdb的时候添加auth参数:
2、客户端进行auth验证的方式
方式一:(类似 MySql)
客户端连接时,指定用户名,密码,db名称
mongo --port 27017 -u "adminUser" -p "adminPass" --authenticationDatabase "admin"
方式二:
客户端连接后,再进行验证
# 客户端连接
mongo --port 27017
# 指定数据库
use admin
# 因为我们前面在admin数据库下,创建了adminUser用户。所以我们必须在【指定的数据库admin】下,进行用户身份认证。
db.auth("adminUser", "adminPass") // 输出 1 表示验证成功
账号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth),哪里创建哪里认证。
3、auth使用中的坑
mongodb 不允许一次会话认证多个用户。
简单的说:在一次mongdb会话中,使用db.auth的次数不能超过一次;否则就会可能在操作过程中报如下错误:
uncaught exception: Error: logical sessions can't have multiple authenticated users (for more details see: https://docs.mongodb.com/manual/core/authentication/#authentication-methods) :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.getUsers@src/mongo/shell/db.js:1640:15
shellHelper.show@src/mongo/shell/utils.js:933:9
shellHelper@src/mongo/shell/utils.js:838:15
@(shellhelp2):1:1
二、管理所有数据库角色与管理指定数据库角色
如果你想要给A用户赋予一个管理所有数据库的权限,那么你需要到admin数据库下,给A用户赋予这几个角色:
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
- root:只在admin数据库中可用。超级账号,超级权限。
如果你想要给A用户赋予一个管理指定数据库的权限,那么你需要到指定数据库下,给A用户赋予这几个角色:
- read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
- root:只在admin数据库中可用。超级账号,超级权限。
1、mongdb内置了哪些角色
创建一个账号,该账号需要有grant权限,即:账号管理的授权权限。
注:账号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth),哪里创建哪里认证
#使用admin库
> use admin
#创建用户
> db.createUser(
{
user:'user1',
pwd:'user1',
roles[{role:'root',db:'admin'}]
}
)
roles:指定用户的角色,可以用一个空数组给新用户设定空角色;roles 可指定内置角色和用户定义的角色。
role可选值:
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
- 内部角色:__system
- 间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
具体角色:
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限。
只在admin数据库可用:
意思是必须位于admim数据库下,才能赋予用户clusterAdmin、readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、root这几个角色权限。
2、用户角色创建案例
前提,mongdb开启了auth认证。
1.管理员 - root角色权限
创建用户+角色:
新开一个mongdb客户端连接:
chenmingsong@chenmingsongdeMacBook-Pro bin % ./mongo
MongoDB shell version v5.0.7
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("2fd6ff65-a3fd-4496-8f13-5efe336836cc") }
MongoDB server version: 5.0.7
================
Warning: the "mongo" shell has been superseded by "mongosh",
which delivers improved usability and compatibility.The "mongo" shell has been deprecated and will be removed in
an upcoming release.
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
================
> db
test # 连接成功之后,默认位于test数据库(我前面没有对test数据库做任何操作)
> show dbs # 没有返回值
> use admin # 切到admin数据
switched to db admin
> db.auth("root","root") # 进行权限验证(之前在admin数据库下创建了root用户,给的角色权限是最高权限root)
1
> show dbs
admin 0.000GB
config 0.000GB
example 0.000GB
local 0.000GB
2.普通用户
// 使用某张表,然后查看该表下有哪些用户
use example;
// 无任何用户,又因为开启了auth=true那么外部访问的时候是访问不到的
show users;
// 给example数据库添加角色是"readWrite"的用户
db.createUser(
{
user:'cms',
pwd:'cms',
roles:[{role:'readWrite',db:'example'}]
}
)
// 再次执行,发现example数据库有个用户
show users;
新开一个mongdb客户端连接:
chenmingsong@chenmingsongdeMacBook-Pro bin % ./mongo
MongoDB shell version v5.0.7
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("2fd6ff65-a3fd-4496-8f13-5efe336836cc") }
MongoDB server version: 5.0.7
================
Warning: the "mongo" shell has been superseded by "mongosh",
which delivers improved usability and compatibility.The "mongo" shell has been deprecated and will be removed in
an upcoming release.
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
================
> db
test # 连接成功之后,默认位于test数据库(我前面没有对test数据库做任何操作)
> show dbs # 没有返回值
> use example
switched to db example
> db
example
> db.auth("cms","cms")
1
> show dbs
example 0.000GB
> show tables
email_message
example_collect
inventory
members
userInfo
3、用户CURD操作
db命令,可用查看当前处于哪个数据库。然后在具体某个数据库下,对用户进行操作。
1.创建用户并赋角色
#使用admin库
> use admin
#创建用户
> db.createUser(
{
user:'user1',
pwd:'user1',
roles:[{role:'root',db:'admin'}]
}
)
2.查询用户
use test;
show users # 查询当前数据库下的所有用户
3.删除用户
use test;
db.dropUser("user1") # 删除当前库下user1用户
db.dropAllUsers() #删除当前库所有用户
4.修改密码
use test;
db.changeUserPassword("user","new_passwd")
5.修改用户的角色
use test;
> db.updateUser(
... "myUserAdmin",
... {
... roles : [
... {"role" : "userAdminAnyDatabase","db" : "admin"},
... {"role" : "dbOwner","db" : "admin"},
... {"role" : "clusterAdmin", "db": "admin"}
... ]
... }
... )
4、角色操作
1.回收角色权限
回收某个用户的角色,首先进入目标库:use test。
db.revokeRolesFromUser("testuser",[ { role: "read",db:"admin"} ] )
2.添加角色
给某个用户添加角色。
(1)首先进入目标库:use example。
(2)添加读写权限:
db.grantRolesToUser( "cms", [ { role: "readWrite",db:"example"} ] )
(3)添加dbAdmin权限:
db.grantRolesToUser( "cms", [ { role: "dbAdmin",db:"example"} ] )
4、常用mongdb命令
1.use dbname
使用/创建数据库
2.db
查看当前处于哪个数据库
3.show tables
查看当前数据库下面有哪些表
4.show users
查看当前数据库有哪些用户
5.show dbs
查看当前数据库列表