环境
mongodb:3.4
robomongo:1.0.RC1
需求
之前我介绍过,mongodb用户权限管理配置,之后我自己有个这样的想法,能不能像MySQL
客户端那样,一次可以显示多个数据库?
如图:
而robomongo
客户端如图:
刚开始我以为,我只需要给yutao
这个账号,再授予其他数据库的权限,就ok
.
创建数据库
mongodb是没有创建数据库的命令的,一般是这么做:
# 使用use命令切换到myTest数据库,若没有系统会自动创建# 如果我们什么也不干,数据库会被系统回收掉>use myTest# 创建一个集合,并创建数据>db.myuser.insert({"name":"yutao", age:24})# 上面这条命令我们并没有显式创建集合`myuser`# mongodb会自动帮我们创建。# 这样数据库和一个集合(类似于表的概念)我们就创建好了
现在我再把该数据库授权给账号yutao
。
修改用户权限
进入mongodb
的安装目录中的bin
目录,再执行命令:mongo.exe
,
接着敲如下命令:
>db.grantRolesToUser(... "yutao",... [{role:"readWrite", db:"myTest"}]... )
以上命令意思是:修改账号yutao
的权限,给其增加个数据库myTest
的读写权。
注:
①账号yutao
,原本具有数据库test
的读写权。
②这里我使用的是db.grantRolesToUser()
命令,而没有使用db.updateUser()
命令的原因是,后者会替换账号的原有的角色,而前者是追加。通俗点讲就是:
账号yutao
,原有权限A
,我现在想再给它一个权限B
,使用updateUser
呢,是把A权限
替换为B权限
,也就是现在账号yutao
,只有B权限
,而grantRolesToUser
,是追加一个B权限
,即账号yutao
,即有A权限
,又有B权限
。
这时账号yutao
,就有了:
①数据库test
的读写权。
②数据库myTest
的读写权。
在admin
数据库中记录如下:
{ "_id" : "test.yutao", "user" : "yutao", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "qgewkOikdl4c/tXTAjd+4Q==", "storedKey" : "0k7fgg42EFwmrrykGUsxotvL/x0=", "serverKey" : "LvjDxD/rbSVgMUEixrbbbQF5BBg=" } }, "roles" : [ { "role" : "readWrite", "db" : "myTest" }, { "role" : "readWrite", "db" : "test" } ] }
官方链接:
db.grantRolesToUser()
db.updateUser()
这里我再随带讲下删除权限
删除权限
cmd
窗口敲如下命令:
> db.revokeRolesFromUser("yutao",... [{role:"read", db:"myTest"}])
这里使用的方法db.revokeRolesFromUser()
;
官方链接:
db.revokeRolesFromUser()
在我使用robomongo
登录数据库test
,并没有显示出myTest
数据库。
如图:
一开始我以为是我命令敲错了,折腾了很久我才发现,是我对mongodb
的认证数据库概念不清楚导致的。
当在mongodb
中创建一个用户时,是要指定它属于哪个数据库(为了便于说明,我假定为A数据库
)而这个A数据库
就是该用户的认证数据库
,通俗点讲就是,该用户只能登陆A数据库
。虽然该用户只能登陆A数据库
,但是我们可以给该用户其他数据库(假定为B数据库
)权限。
这也同时说明两个规则:
①账号是跟着数据库走的。
②认证数据库并不会限制账号的权限。(即:也可以操作其他数据库)
现在我希望账号yutao
,即能登陆数据库test
,又可以登陆数据库myTest
。
根据规则①,我们只需要在myTest
数据库中创建一个和数据库test
一样的账号即可。
命令如下:
> db.createUser({... user:"yutao",... pwd:"yutao",... roles:[{role:"readWrite", db:"myTest"}]... })Successfully added user: { "user" : "yutao", "roles" : [ { "role" : "readWrite", "db" : "myTest" } ]}
注:账号yutao
,此时其实是两个。说白点就是在不同数据库中有两个一样的账号。
robomongo
还有就是在填写验证信息时,也说明账号只能登陆认证数据库。
所以普通用户只能看到一个数据库。
如果是root账号
或者admin账号
,可以看到全部的数据库
不过有区别,root
用户可以打开集合,而admin
用户不可以。
system.users
集合保存的就是创建的用户账号信息。
如图:
总结
由于mongodb
用户的账号是跟着数据库走的,所以也就明了了我之前的问题。