官方文档
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数据库中可用。超级账号,超级权限
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。