Mongodb中可以对用户进行读/写权限控制,主要有如下权限类型
权限类型(角色)说明read赋予用户指定数据库读权限readWrite赋予用户指定数据库读写权限dbAdmin赋予用户在指定数据库中执行管理函数权限,如索引创建、删除,查看 统计或访问 system.profileuserAdmin赋予用户向 system.users 集合写入权限,可以在指定数据库里创建、删 除和管理用户clusterAdmin赋予用户所有分片和复制集相关函数的 管理权限(admin库中可用)readAnyDatabase赋予用户所有数据库的读权限(admin库中可用)readWriteAnyDatabase赋予用户所有数据库的读写权限(admin库中可用)userAdminAnyDatabase赋予用户所有数据库的 userAdmin 权限(admin库中可用)dbAdminAnyDatabase赋予用户所有数据库的 dbAdmin 权限(admin库中可用)root超级管理员(admin库中可用)对应用户管理员,通常只赋予用户操作权限,不授权DB的读写权限,所以授userAdminAnyDatabase权限即可。 管理员账户必须在admin库下创建,而MongoDB 3.0版本后没有默认admin库,需要先手动创建一个。 启动MongoDB后,在bin目录下执行./mongo命令,进入客户端命令窗口。
执行use admin
> use admin switched to db admin执行db.createUser()可以创建用户,下面是执行语句格式 user表示新建的用户名 pwd表示用户密码 customData表示存放一些用户相关的自定义数据(可选) roles是数组类型,表示给用户配置的权限
db.createUser({ user: "<name>", pwd: "<cleartext password>", customData: { <any information> }, roles: [ { role: "<role>", db: "<database>" } | "<role>", ... ] });创建一个用户名为pandafox,密码为123456的用户管理员
> db.createUser({user:'pandafox',pwd:'123456',roles:[{role:'userAdminAnyDatabase',db:'admin'}]}) Successfully added user: { "user" : "pandafox", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }执行db.system.users.find(),可以查看到用户相关信息
> db.system.users.find() { "_id" : "admin.pandafox", "userId" : UUID("22b25314-a601-43b1-af71-f0582f896ece"), "user" : "pandafox", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "9vErokSyPS2tGCeSnSsWzA==", "storedKey" : "vWezRfXwv/fd1vuK/tRKtBDGAWc=", "serverKey" : "4KvyD2348chlHPWehP40O+RZNQQ=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "rJiUl4MKauibSnNXH3md4twF1umLiNDCiH87Kg==", "storedKey" : "qVmeLILDx+D90lw3Rvx7kAdppeU65jEeJ2U919ghqvc=", "serverKey" : "FYb/OmXDZiuGUFo+avcNnv0iszncv6OHrOILLAl/h7c=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }1)在mongodb.conf配置文件中,增加auth启动参数,并设置为true
[root@localhost etc]# cat mongodb.conf dbpath=/usr/local/mongodb/data/db/ logpath=/usr/local/mongodb/log/mongodb.log port=27017 fork=true auth=true2)重启MongoDB服务
1)切换到admin库,未登录情况执行命令,提示无权限,说明admin库已经授权用户成功
> use admin switched to db admin > db.system.users.find() Error: error: { "ok" : 0, "errmsg" : "command find requires authentication", "code" : 13, "codeName" : "Unauthorized" }2)登录,使用db.auth('user','pwd'),返回1表示登录成功
> db.auth('pandafox','123456') 13)再次执行db.system.users.find()会返回对应用户信息
普通用户需要由管理员创建并授权。所以,我们首先做的就是用管理员账户登录数据库。
> use admin switched to db admin > db.auth('pandafox','123456') 1创建testfox用户,密码为123456,拥有test库的读写权限
> db.createUser({user:'testfox',pwd:'123456',roles:[{role:'readWrite',db:'test'}]}) Successfully added user: { "user" : "testfox", "roles" : [ { "role" : "readWrite", "db" : "test" } ] }1)新开一个客户端,切换到test库,并登录
> use test switched to db test > db.auth('testfox','123456') 12)可见读写是ok的
> db.test.insert({name:'tom'}) WriteResult({ "nInserted" : 1 }) > db.test.find() { "_id" : ObjectId("5efbd7687e496edd01619a3d"), "name" : "tom" }3)如果不登录是无法操作的
> db.test.insert({name:'tom'}) WriteCommandError({ "ok" : 0, "errmsg" : "command insert requires authentication", "code" : 13, "codeName" : "Unauthorized" })使用 db.updateUser()函数进行修改
> db.updateUser("pandafox",{roles:[{"role":"userAdminAnyDatabase","db":"admin"},{"role":"dbAdminAnyDatabase","db":"admin"}]}) > show users { "_id" : "admin.pandafox", "userId" : UUID("22b25314-a601-43b1-af71-f0582f896ece"), "user" : "pandafox", "db" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" }, { "role" : "dbAdminAnyDatabase", "db" : "admin" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] }1)使用db.updateUser()函数(有用户管理权限) 修改密码
db.updateUser('pandafox',{'pwd':'654321'})断开连接,重新登录验证
> use admin switched to db admin > db.auth('pandafox','123456') Error: Authentication failed. 0 > db.auth('pandafox','654321') 12)使用db.changeUserPassword()函数(有用户管理权限) 修改密码
> db.changeUserPassword('pandafox','123456')断开连接,重新登录验证
> use admin switched to db admin > db.auth('pandafox','654321') Error: Authentication failed. 0 > db.auth('pandafox','123456') 1使用 db.dropUser()函数删除用户,成功则返回true
> use test switched to db test > db.dropUser('testfox') true > show users >