微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mongodb关于用户权限的总结

官方文档

https://docs.mongodb.com/v3.6/reference/built-in-roles/

https://docs.mongodb.com/v3.6/reference/method/db.auth/


总结

1、mongodb启动的时候加了--auth参数,则mongo命令连接到mongodb数据库后,执行show dbs这样的操作都会报错,需要执行db.auth("user","PWD")验证用户密码正确后,才能执行操作,且该user有什么权限就只能执行什么操作

2、授权操作可以在创建用户db.createuser的时候授权,也可以使用db.grantRolesToUser对已存在用户授权

3、mongodb的用户是放在一个个的数据库里面,比如db.system.users.find()显示_id为db1.user1表示在db1库中创建了一个用户user1,_id为db2.user1表示在db2库中创建了一个用户user1,和mysql用户模式user@host有点类似

4、root、readWriteAnyDatabase等角色的用户必须绑定admin库,不是说root角色的用户只能在admin库中创建,如下在test1库中建立用户名为root的用户,拥有root角色绑定了admin库,以后在test1库中执行auth正常后,可以执行任何操作。当然这个test1库中建立的root用户在admin库中执行auth会报错Error: Authentication Failed,因为这个用户并不是admin库中的用户

>use test1
>db.createuser({user:"root",pwd:"123456",roles:[{role:"root",db:"admin" }]})

5、mongodb中admin数据库一个特别的数据库,一些角色只能在admin库中用,但是不代表admin库中的用户就拥有所有权限,如下在admin库中建立一个用户admin_user,这个用户只在admin库中有读权限,无法读其他数据库

>use admin
>db.createuser({user:"admin_user",pwd:"123456",roles:["read"]})

6、db.auth("user","PWD")验证时,这个用户user必须存在当前数据库下,如果当前数据库下不存在这用户则会报错。不能说具有root角色的用户可以在任何数据库中执行db.auth验证,只能说具有root角色的用户1在这用户1指定的数据库中执行db.auth验证后,可以访问其他所有数据库

7、异机使用mongo命令连接mongodb数据库服务器数据库时,必须指定该数据库存在的用户名和密码。如下192.168.0.10/test1库存在一个root超级管理员角色的用户root密码是123456,在test1库中执行db.auth("root","123456")后是可以访问所有数据库的,但是192.168.0.10/test123库不存在这样的用户。则前一条语句可以正常连接,后一条语句报错Error: Authentication Failed无法连接。

mongo 192.168.0.10/test1 -u root -p "123456"   --正常,可以连接
mongo 192.168.0.10/test123 -u root -p "123456"  --报错,认证失败,无法连接

8、mongodb查看当前用户使用命令db.runcommand({connectionStatus:1}),就像oracle执行show users可以显示当前会话的用户




创建用户的时候授权db.createuser

>use test1
>db.createuser({user:"a1",pwd:"123456",roles:[{role:"clusteradmin",db:"admin" },{role:"readAnyDatabase",db:"admin" },{role:"readWrite",db:"test"},"readWrite"]})

在test1这个数据库中创建了一个用户a1,这个用户拥有集群管理权限、查询任何数据库的权限、读写test数据库权限、读写test1数据库的权限,最后一个readwrite没有标明数据库表示在本地数据库的权限即在test1这个数据库的权限

这个用户a1,show users时只能在test1这个数据库看到,在admin这个数据库执行show users看不这个用户a1,因为这个用户不是admin下面的用户


readAnyDatabase角色必须绑定admin库,否则报错

>db.createuser({user:"a2",pwd:"123456",roles:[{role:"readAnyDatabase",db:"test" }]})

报错[thread1] Error: Couldn't add user: No role named readAnyDatabase@test

readAnyDatabase只在admin中可用,把db:"test"改成db:"admin"即可


授予权限db.grantRolesToUser

>use test1
>db.grantRolesToUser("a1",[{role:"readWrite",db:"test2"}])

数据库test1中的a1用户授予test2数据库的读写权限


取消权限db.revokeRolesFromUser

>use test1
>db.revokeRolesFromUser("a1",[{role:"readWrite",db:"test2"}])

数据库test1中的a1用户取消test2数据库的读写权限


查询用户的三种方法

>show users --只能查看当前数据库下的用户
>use admin
>db.system.users.find() --必须进入admin数据库执行,能查询所有数据库下的所有用户
>db.system.users.find().pretty() --必须进入admin数据库执行,能查询所有数据库下的所有用户,结果显示界面比db.system.users.find()友好

如果不是进入admin数据库而是进入其他数据库比如A执行上面两个,没有返回结果,就算这个数据库A下有用户


删除用户

>db.dropAllUsers();--删除当前库下面的所有用户,其他库的用户不受影响
>db.dropUser('a3');--删除当前库下面的a3用户


验证用户

>use test1
>db.auth("a1","123456")

数据库test1中的a1用户进行验证,首先在test1库中,a1用户必须存在,其次a1用户的密码必须是123456,才能验证成功

结果返回1表示成功


mongodb启动时没有用--auth参数,mongo命令连接后也可以执行db.auth

use db
db.createuser({user:"admin2",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
db.auth("admin2","admin2")--报错Error: Authentication Failed
db.auth("admin2","123456")


角色列表

Read:允许用户读取指定数据库

readWrite:允许用户读写指定数据库

dbAdmin:允许用户拥有指定数据库的的所有权限,如数据库或集合或索引的创建、删除,查看

userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户及角色

clusteradmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。

readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限

readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限

userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限

dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。

root:只在admin数据库中可用。超级账号,超级权限

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐