我们在安装完mongodb之后,默认是没有开启权限认证的, 但是我们在生产环境权限认证是必不可少的
1. 创建用户
- 启动mongo shell
我们先创建个管理员账号(该账号可以对所有数据库进行用户管理)
C:\Users\xxx>mongo
> use admin
switched to db admin
> db.createUser(
... {
... user: "admin",
... pwd: "123456",
... roles: [ { role: "userAdminAnyDatabase", db: "admin"} ]
... }
... )
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
>
2. 开启权限认证
如果是命令模式启动的话,就在原来的启动参数上,在加上 –auth 即可
c:\> mongod --auth --dbpath "D:\Program Files\MongoDB\Server\4.0\data"
如果是windows service方式运行的话,打开 mongo配置文件mongod.cfg, 在security项下,将authorization设置为enabled, 默认是disabled
security:
authorization: enabled
然后重启service就可以了
3. 以认证的方式连接mongo
- 连接的时候认证
C:\Users\xxx>mongo -port 27017 -u "admin" -p "123456" --authenticationDatabas
e "admin"
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 4.0.1
> use admin
switched to db admin
> show users;
{
"_id" : "admin.admin",
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
>
- 连接好了之后,再认证
C:\Users\xxx>mongo
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
> use admin
switched to db admin
> db.auth("admin", "123456")
1
> show users;
{
"_id" : "admin.admin",
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
>
4. 根据需要创建其他的账号
- 比如我有一个test库,我需要读写权限,然后有个game_report库,我需要只读权限, 然后我们就可以如下创建一个账号:
> use admin
switched to db admin
> db.createUser(
... {
... user : "my_tester",
... pwd : "123456",
... roles: [ { role : "readWrite", db : "test" } ,
... { role : "read", db : "game_report" } ]
... }
... )
Successfully added user: {
"user" : "my_tester",
"roles" : [
{
"role" : "readWrite",
"db" : "test"
},
{
"role" : "read",
"db" : "game_report"
}
]
}
- 以认证方式连接test库
C:\Users\xxx>mongo
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
> use admin
switched to db admin
> db.auth("my_tester", "123456")
1
> use test
switched to db test
> db.foo.insert( { x : 1, y : 2 } )
WriteResult({ "nInserted" : 1 })
> db.foo.find()
{ "_id" : ObjectId("5b67fc008bd89ebd4abc54aa"), "x" : 1, "y" : 2 }
>
5. 权限说明(基于角色的权限控制)
5.1 内置角色
数据库用户角色
- read: 只读数据权限
- readWrite:学些数据权限
数据库管理角色
- dbAdmin: 在当前db中执行管理操作的权限
- dbOwner: 在当前db中执行任意操作
- userADmin: 在当前db中管理user的权限
备份和还原角色
- backup
- restore
夸库角色
- readAnyDatabase: 在所有数据库上都有读取数据的权限
- readWriteAnyDatabase: 在所有数据库上都有读写数据的权限
- userAdminAnyDatabase: 在所有数据库上都有管理user的权限
- dbAdminAnyDatabase: 管理所有数据库的权限
集群管理
- clusterAdmin: 管理机器的最高权限
- clusterManager: 管理和监控集群的权限
- clusterMonitor: 监控集群的权限
- hostManager: 管理Server
超级权限
- root: 超级用户
5.2 自定义角色
内置角色只能控制User在DB级别上执行的操作,管理员可以创建自定义角色,控制用户在集合级别(Collection-Level)上执行的操作,即,控制User在当前DB的特定集合上执行特定的操作