MongoDB身份验证--命令行模式

摘要 
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服务
  
  
  
  
  • 1
  • 1

重新登录:

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");                                                          ## 并不是在test中创建的用户
Error: Authentication failed.
0
> use admin                                                                    ## 切换到admin
switched to db admin
> db.auth("su","su");
1                                                                              ## 验证成功
>
>
> use test                                                                     ## 在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();                                                    ## 查看失败,userAdminAnyDatabase 只是针对用户的管理权限,并没有对数据的操作权限
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.安全检查未开启的情况下,在其他的数据库创建对应的用户也是可以的。



你可能感兴趣的:(mongodb)