前言
当我们以上一篇的方式开启mongo server的时候,我们的数据库是裸奔着的。在生产环境,必须有安全认证机制。mongodb提供了好几种机制,我们来说一种基于用户和角色的权限认证机制。
创建Root用户
-
首先,我们先正常方式开启服务器,默认是没有开启认证机制的:
sudo mongod --port 27017 --dbpath /var/lib/mongodb &
连接到server,并查看当前的数据库:
mongo show dbs
mongodb默认会有一个空的admin数据库,里面专门用来管理用户的。
-
然后,我们进入admin数据库,创建一个root用户,它负责操作管理用户;给它分配的权限是能够操作当前admin的用户数据,也就是说可以增加删除和更新所有用户,但是并不能去操作其他数据库的数据:
注意: mongodb的用户认证有一个限制,就是在哪个数据库创建的用户,就必须在哪个数据库登录认证,不管这个用户的角色有多大。
use admin db.createUser( ... { ... user: "root", ... pwd: "your psw", ... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] ... } ... )
其中,用户的admin表示能够操作的数据库,role表示用户的角色,可选的取值为:
- Read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
- root:只在admin数据库中可用,能操作所有数据库的数据
此时,关掉mongo server,以开启认证的方式进行重启,并进入admin数据库:
sudo mongod --auth --port 27017 --dbpath /var/lib/mongodb & mongo use admin
-
登录认证,注意,只能在admin中进行登录认证,认证后才能进行其他操作:
db.auth('root', 'your psw') //其他操作 db.getUsers() //查看用户admin db.createUser(...) db.updateUser(username, { role: "xxx", db: "xxx" }) db.dropUser(username) db.dropAllUsers()
创建普通用户
-
首先,需要进入test数据库,专门为test数据库创建一个普通用户:
use test db.createUser( ... { ... user: "test", ... pwd: "your psw", ... roles: [ { role: "readWrite", db: "test" } ] ... } ... )
-
其次,进行普通用户的认证,我们就可以操作数据了:
db.auth('test', 'your psw') //操作数据 db.abc.insert({'a':'b'}) db.abc.find()
总结
mongodb用户管理的一般做法是:
- 先在admin中创建一个root用户,专门负责管理所有数据库的用户的,但是它的操作范围只能是admin内
- 然后再给指定的数据库专门创建普通用户,角色是可读写,操作范围只能是这个数据库
- 用户总是专属于某个数据库。在哪个数据库创建用户,就只能在那个数据库进行登录认证;认证之后才能进行其他的数据操作