上一篇说到了把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 }
发现能够成功读数据。