有朋友在评论里问到关于mongodb的auth的问题,我找资料研究了一下,把操作过程记录了下来。
Mongodb像oracle一样,有着严格的用户、角色权限控制。具体可以参照官网文档:https://docs.mongodb.com/manual/reference/method/db.createUser/
Mongodb创建用户的语法在不用的版本之间还是不一样的。我这里使用的版本3.0.6。版本3.0之前使用的是db.addUser(),但3.0之后使用的是db.createUser()。3.0后版本中再使用db.addUser()会报如下错误:
1
2
|
> db.addUser(
'dba'
,
'dba'
)
2017-11-17T13:17:08.001+0800 E QUERY TypeError: Property
'addUser'
of object admin is not a
function
|
如果数据库中还没有添加任何用户,要想新创建一个用户,要先把auth认证停掉,在进入数据库,也就是让auth=false。
1
2
3
4
5
6
7
8
9
10
11
|
[root@MidApp mongodb]
# cat mongodb.conf#配置文件
dbpath=
/data/db
logpath=
/usr/local/mongodb/logs/mongodb
.log
logappend=
true
port=27000
fork=
true
auth=
false
nohttpinterface=
false
bind_ip=192.168.221.161
journal=
false
quiet=
true
|
登入数据库,只能看到一个库,看不到admin库:
1
2
3
4
5
|
[root@MidApp mongodb]
# mongo 192.168.221.161:27000
MongoDB shell version: 3.0.6
connecting to: 192.168.221.161:27000
/test
> show dbs
local
0.078GB
|
现在需要创建一个帐号,该账号需要有grant权限,即:账号管理的授权权限。注意一点,mongodb帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
> use admin
switched to db admin
> db.createUser({user:
"dba"
,
pwd
:
"dba"
,roles:[{role:
"userAdminAnyDatabase"
,db:
"admin"
}]})
Successfully added user: {
"user"
:
"dba"
,
"roles"
: [
{
"role"
:
"userAdminAnyDatabase"
,
"db"
:
"admin"
}
]
}
> db.system.
users
.
find
()
{
"_id"
:
"admin.dba"
,
"user"
:
"dba"
,
"db"
:
"admin"
,
"credentials"
: {
"SCRAM-SHA-1"
: {
"iterationCount"
: 10000,
"salt"
:
"MXvU7oJanxW7gPw+NwI7rw=="
,
"storedKey"
:
"lTPmK31qbk1YKmx5stmYiphsQZE="
,
"serverKey"
:
"gVovcstiwC0nuU6LTXZAiWkucfA="
} },
"roles"
: [ {
"role"
:
"userAdminAnyDatabase"
,
"db"
:
"admin"
} ] }
> db.system.
users
.
find
().pretty()
{
"_id"
:
"admin.dba"
,
"user"
:
"dba"
,
"db"
:
"admin"
,
"credentials"
: {
"SCRAM-SHA-1"
: {
"iterationCount"
: 10000,
"salt"
:
"MXvU7oJanxW7gPw+NwI7rw=="
,
"storedKey"
:
"lTPmK31qbk1YKmx5stmYiphsQZE="
,
"serverKey"
:
"gVovcstiwC0nuU6LTXZAiWkucfA="
}
},
"roles"
: [
{
"role"
:
"userAdminAnyDatabase"
,
"db"
:
"admin"
}
]
}
|
可以看到创建了一个用户dba,密码dba,拥有admin库的userAdminAnyDatabase角色。下面看一下mongodb中的内置角色:
1
2
3
4
5
6
7
8
|
1. 数据库用户角色:
read
、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
//
这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system
|
看一下具体的角色定义:
1
2
3
4
5
6
7
8
9
10
|
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.
users
集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
|
我们打开auth参数,来验证一下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
[root@MidApp mongodb]
# mongo 192.168.221.161:27000
MongoDB shell version: 3.0.6
connecting to: 192.168.221.161:27000
/test
> show dbs
#没有验证,不会有权限
2017-11-17T13:04:35.357-0800 E QUERY Error: listDatabases failed:{
"ok"
: 0,
"errmsg"
:
"not authorized on admin to execute command { listDatabases: 1.0 }"
,
"code"
: 13
}
at Error (<anonymous>)
at Mongo.getDBs (src
/mongo/shell/mongo
.js:47:15)
at shellHelper.show (src
/mongo/shell/utils
.js:630:33)
at shellHelper (src
/mongo/shell/utils
.js:524:36)
at (shellhelp2):1:1 at src
/mongo/shell/mongo
.js:47
> use admin
#在admin库下面添加的账号,所以要切到admin下面认证
switched to db admin
> db.auth(
'dba'
,
'dba'
)
1
> show dbs
admin 0.078GB
local
0.078GB
|
可以看到,创建的dba用户已经验证成功。接下来我在创建两个用户,验证一下其他角色权限。创建一个只读用户,一个读写用户。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
> use
test
;
switched to db
test
> db.createUser({user:
"zduser"
,
pwd
:
"zduser"
,roles:[{role:
"read"
,db:
"test"
}]})
Successfully added user: {
"user"
:
"zduser"
,
"roles"
: [
{
"role"
:
"read"
,
"db"
:
"test"
}
]
}
> db.createUser({user:
"dxuser"
,
pwd
:
"dxuser"
,roles:[{role:
"readWrite"
,db:
"test"
}]})
Successfully added user: {
"user"
:
"dxuser"
,
"roles"
: [
{
"role"
:
"readWrite"
,
"db"
:
"test"
}
]
}
> show
users
;
{
"_id"
:
"test.zduser"
,
"user"
:
"zduser"
,
"db"
:
"test"
,
"roles"
: [
{
"role"
:
"read"
,
"db"
:
"test"
}
]
}
{
"_id"
:
"test.dxuser"
,
"user"
:
"dxuser"
,
"db"
:
"test"
,
"roles"
: [
{
"role"
:
"readWrite"
,
"db"
:
"test"
}
]
}
>
|
在test库中创建一个集合,验证一下这两个用户权限:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
> show tables;
#userAdminAnyDatabase权限只针对用户管理,没有其他的权限
2017-11-17T13:47:39.845-0800 E QUERY Error: listCollections failed: {
"ok"
: 0,
"errmsg"
:
"not authorized on test to execute command { listCollections: 1.0 }"
,
"code"
: 13
}
at Error (<anonymous>)
at DB._getCollectionInfosCommand (src
/mongo/shell/db
.js:646:15)
at DB.getCollectionInfos (src
/mongo/shell/db
.js:658:20)
at DB.getCollectionNames (src
/mongo/shell/db
.js:669:17)
at shellHelper.show (src
/mongo/shell/utils
.js:625:12)
at shellHelper (src
/mongo/shell/utils
.js:524:36)
at (shellhelp2):1:1 at src
/mongo/shell/db
.js:646
>
exit
bye
[root@MidApp mongodb]
# mongo 192.168.221.161:27000 #重新登录一下
MongoDB shell version: 3.0.6
connecting to: 192.168.221.161:27000
/test
> use
test
switched to db
test
> db.tb1.insert({
"a"
:1,
"b"
:2})
#先试着插入数据看看
WriteResult({
"writeError"
: {
"code"
: 13,
"errmsg"
:
"not authorized on test to execute command { insert: \"tb1\", documents: [ { _id: ObjectId('5a0f595b3b6523dcb81d4f76'), a: 1.0, b: 2.0 } ], ordered: true }"
}
})
> db.auth(
'dxuser'
,
'dxuser'
)
#用可读写的用户认证
1
> db.tb1.insert({
"a"
:1,
"b"
:2})
#可以插入数据
WriteResult({
"nInserted"
: 1 })
> db.tb1.insert({
"a"
:11,
"b"
:22})
WriteResult({
"nInserted"
: 1 })
> db.tb1.insert({
"a"
:111,
"b"
:222})
WriteResult({
"nInserted"
: 1 })
> db.tb1.
find
()
{
"_id"
: ObjectId(
"5a0f597f3b6523dcb81d4f77"
),
"a"
: 1,
"b"
: 2 }
{
"_id"
: ObjectId(
"5a0f59933b6523dcb81d4f78"
),
"a"
: 11,
"b"
: 22 }
{
"_id"
: ObjectId(
"5a0f59983b6523dcb81d4f79"
),
"a"
: 111,
"b"
: 222 }
> db.auth(
'zduser'
,
'zduser'
)
#切换只读用户
1
> db.tb1.insert({
"a"
:1111,
"b"
:2222})
#没有权限插入数据
WriteResult({
"writeError"
: {
"code"
: 13,
"errmsg"
:
"not authorized on test to execute command { insert: \"tb1\", documents: [ { _id: ObjectId('5a0f59c63b6523dcb81d4f7a'), a: 1111.0, b: 2222.0 } ], ordered: true }"
}
})
> db.tb1.
find
()
#可以查看数据
{
"_id"
: ObjectId(
"5a0f597f3b6523dcb81d4f77"
),
"a"
: 1,
"b"
: 2 }
{
"_id"
: ObjectId(
"5a0f59933b6523dcb81d4f78"
),
"a"
: 11,
"b"
: 22 }
{
"_id"
: ObjectId(
"5a0f59983b6523dcb81d4f79"
),
"a"
: 111,
"b"
: 222 }
>
|
注意:Mongodb用户是跟着数据库密切相关的,在哪个库授权的用户就需要去哪个库下面进行认证。
本文转自 青苗飞扬 51CTO博客,原文链接:http://blog.51cto.com/qingmiao/1982794