MongoDB上手笔记2——新建用户并设置权限

上一篇说到了把MongoDB安装完毕,并设置了开机启动服务。接下来记录下怎么创建用户,并通过MongoDB的权限管理功能进行管理。

mongodb的用户权限管理的方式是分组的,不同的用户组有着不同的权限,对应的就是可以执行不同的命令。

形象地说就是警察用户组的只有抓捕的权力,医生用户组的只有开处方的权力等等。MongoDB的用户组的设置也秉承了这样的方法,在保证能正常使用的前提下,只给特定用户最少的权力。

首先,先启动mongod,此处使用配置文件的启动方法。

mongod --config E:/MongoDB/mongod.conf

然后连接mongodb。

mongo 127.0.0.1:27999
show dbs
use admin

这个时候可以看到成功的连接了进去,只有一个local的数据库。然后切换到admin数据库,准备创建用户。

MongoDB内置了许多类型的用户类型,大致分为了几类:

  • 单个数据库用户(Database User Roles)
  • 单个数据库管理员(Database Administration Roles)
  • 集群管理员(Cluster Administration Roles)
  • 备份恢复管理员(Backup and Restoration Roles)
  • 全部数据库的管理员(All-Database Roles)
  • 超级用户(Superuser Roles)

不同的用户类别下都有若干个用户类型,分别对应的这不同的权力。比如现在有一个数据库里记录着不同时间段的测量数据,我们想把特定时间段的测量数据读出来,然后在脚本里输出成csv文件,我们就需要一个read用户就够了,而不需要一个root用户(对应的就是上面说的『最少权力』的原则)。

回到正题,简单的举个例子,我们需要一个read用户用来读测量数据用来显示输出,一个readWrite用户用来写数据进入数据库,还有一个权力最大的用户来管理用户和数据库。然我就像建立一个公司一样,我们先任命一个boss,然后再由boss找员工(当然如果这个公司只有一个人的话,boss又要当老板,又要当苦力,那么在roles里面填多个role就可以了)。

db.createUser({user: "boss",pwd: "123456",roles:[{ role: "userAdminAnyDatabase", db: "admin" }]})

我们创建了一个叫boss的用户,他的角色是userAdminAnyDatabase,。从名字上也能看出来,userAdminAnyDatabase类型的用户可以管理所有数据库下的用户。(如果想在创建这个用户之前就开启权限管理,则需要在配置文件中开启localhost exception)

完成了用户管理员的创建之后就可以重新启动启用了权限管理的MongoDB了(此处在管理员权限的cmd中安装了mongoDB的服务)。

mongod --config E:/MongoDB/mongod.conf --auth --install

如果这个时候直接登陆的话,会发现有的命令是无法执行的,因为没有这个权限。比如最简单的显示所有的数据库都无法执行。

C:\Users\Juiceyang>mongo 127.0.0.1:27999/admin
MongoDB shell version: 3.0.6
connecting to: 127.0.0.1:27999/admin
> db
admin
> show dbs
2015-12-13T20:29:44.926+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
> ^C
bye

而登录了之后,就获得了部分权限,比如可以看都有哪些数据库了。

C:\Users\Juiceyang>mongo 127.0.0.1:27999/admin -u boss -p 123456
MongoDB shell version: 3.0.6
connecting to: 127.0.0.1:27999/admin
> show dbs
admin  0.078GB
local  0.078GB

之后就可以开始创建其他的用户了,创建的方法和创建boss的方法一样。假设我们需要对logs数据库进行读写。

use logs
db.createUser({user: "reader",pwd: "123456",roles:[{ role: "read", db: "logs" }]})
db.createUser({user: "readwriter",pwd: "123456",roles:[{ role: "readWrite", db: "logs" }]})

之后尝试用reader用户往gen1集合写一次数据。

> db.gen1.insert({"time":1, "value":1});
WriteResult({
        "writeError" : {
                "code" : 13,
                "errmsg" : "not authorized on logs to execute command { insert:
\"gen1\", documents: [ { _id: ObjectId('566d691840d302a5c4e9cfc6'), time: 1.0, v
alue: 1.0 } ], ordered: true }"
        }
})

发现无法写入,原因是没有权限执行insert。

之后换readwriter尝试一次。

> db.auth("readwriter","123456")
1
> db.gen1.insert({"time":1, "value":1});
WriteResult({ "nInserted" : 1 })

发现成功写入了。

再换回reader,读一次数据。

> db.auth("reader","123456")
1
> db.gen1.find()
{ "_id" : ObjectId("566d696a40d302a5c4e9cfc7"), "time" : 1, "value" : 1 }

发现能够成功读数据。