摘要
MongoDB3.x与之前的版本有很大区别,这里简单介绍一下用户身份验证相关内容。
1. 了解3.x版本添加用户的函数
函数:
db.createUser(user,writeConcern);
参数:
user这个文档关于用户身份认证和访问的相关信息;
writeConcern这个文档描述MongoDB提供写操作的相关信息。
user 文档提供的格式:
{ user: “”,
pwd: “”,
customData: { },
roles: [
{ role: “”, db: “” } | “”,
…
]
user 文档字段介绍:
user:用户名
pwd:密码
roles:指定用户的角色,可以用一个空数组给新用户设定空角色;
在roles字段,可以指定内置角色和用户定义的角色。
role里的角色可以选:
Built-In Roles(内置角色):
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
角色释义:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
2.添加用户
在安装MongoDB完成后,启动未启用安全检查的MongoDB服务,进入查看数据库,只有一个local库,admin库是不存在的。
现在创建一个拥有授权权限的帐号,su,这里注意一下在哪个库下创建的用户必须要在那个库下去验证(auth)。
MongoDB shell version: 3.2.3
connecting to: test
> use admin
switched to db admin
> db.createUser({user:"su",pwd:"su", roles: [{ role: "userAdminAnyDatabase", db: "admin" }]});
Successfully added user: {
"user" : "su",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
上面创建一个拥有 userAdminAnyDatabase 角色,用来管理用户的用户,可以通过这个角色来创建、删除用户。验证时需要重新启动MongoDB服务,加上–auth参数。
>mongod --auth
重新登录:
MongoDB shell version: 3.2.3
connecting to: test
> show dbs;
2016-04-27T14:34:44.573+0800 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" : 13
} :
_getErrorWithCode@src/mongo/shell/utils.js:23:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:53:1
shellHelper.show@src/mongo/shell/utils.js:700:19
shellHelper@src/mongo/shell/utils.js:594:15
@(shellhelp2):1:1
>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
因为在admin创建的用户,在test下验证所以失败了
MongoDB shell version: 3.2.3
connecting to: test
> db.auth("su","su");
Error: Authentication failed.
0
> use admin
switched to db admin
> db.auth("su","su");
1
>
>
> use test
switched to db test
> db.createUser({user:"mengximengxi",pwd:"mengximengxi", roles: ["read"]});
Successfully added user: { "user" : "mengximengxi", "roles" : [ "read" ] }
> db.createUser({user:"mxmx",pwd:"mxmx", roles: ["readWrite"]});
Successfully added user: { "user" : "mxmx", "roles" : [ "readWrite" ] }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
3.验证
> use admin
switched to db admin
> db.auth("su","su");
1
> db.test.find();
Error: error: {
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { find: \"test\", filter: {} }",
"code" : 13
}
> db.auth("mengximengxi","mengximengxi");
1
> db.test.insert({name:"zhaoxiaoliu"});
WriteResult({
"writeError" : {
"code" : 13,
"errmsg" : "not authorized on test to execute command { insert: \"test\", documents: [ { _id: ObjectId('5720636a26c1f39ce9a7a9bd'), name: \"zhao xiaoliu\" } ], ordered: true }"
}
})
> db.auth("mxmx","mxmx");
1
> db.test.insert({name:"zhaoxiaoliu"});
WriteResult({ "nInserted" : 1 })
>
- 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
- 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
只有拥有root权限才既有授权权限,又有对集合操作的权限。
> db.createUser({user:"root",pwd:"root", roles: [{role:"root",db:"admin"}]});
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
> db.test.insert({name:"tianxiaoqi"});
WriteResult({ "nInserted" : 1 })> db.createUser({user:"test_user",pwd:"mxmx", roles: ["readWrite"]});
Successfully added user: { "user" : "test_user", "roles" : [ "readWrite" ] }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
4.注意
1.可以在当前数据库下去创建其他数据库的用户帐号,但是该帐号只能在当前数据库下才能验证通过,然后才能去操作对应的数据库;
2.安全检查未开启的情况下,在其他的数据库创建对应的用户也是可以的。