暂无图片
mongodb 控制用户登入
我来答
分享
云_2019
2023-08-11
mongodb 控制用户登入

【场景】当在线环境切换时需要控制用户登入DB,但是居我了解Mongodb用户权限是控制在角色上,如

read,readWrite等

如:

mongos>db.runCommand({

upDateUser:"x1",

roles:[{role:"read",db:"xxxx"}]

})

如上:其实用户还是可以登入到数据库,只是不能写库。如何控制用户不允许登入库呢?

我来答
添加附件
收藏
分享
问题补充
8条回答
默认
最新
伟鹏

先创建一个nologin的角色,然后创建用户的时候将这个角色指定给他就行了

暂无图片 评论
暂无图片 有用 1
暂无图片
云_2019
题主
2023-08-11
感谢回复,我真不知道如何创建这个角色,麻烦你给一个案例。
伟鹏

创建角色:

use admin db.createRole({ role: "noLogin", privileges: [], roles: [] })

创建/更新用户:

use admin db.createUser({ user: "x1", pwd: "password", roles: [{ role: "noLogin", db: "xxxx" }] })

暂无图片 评论
暂无图片 有用 1
云_2019
题主
2023-08-14
--------------没有达到预期的效果--------------------- mongos>use admin mongos>db.createRole({role:"nologin",privileges:[],roles:[]}) 执行返回信息:{"role":"nologin","privileges":[],"roles":[]} mongos>db.createUser({user:"xxxxx",pwd:"xxxxfdad",roles:[{role:"nologin",db:"xxxxx"}]}); 执行返回信息:2023-08-14T09:32:07.473+0800 E QUERY [js] Error: couldn't add user: No role named nologin@test : mongos>db.version() 4.0.3
伟鹏

db.getRoles() 确认是否创建成功该角色

暂无图片 评论
暂无图片 有用 0
云_2019
题主
2023-08-14
db.getRoles() [ { "role":"nologin", "db":"admin", "isBuiltin":false, "roles":[], "inhreitedRoles"[] }
伟鹏

这个显示是已经成功了,请确认创建语句,应用的角色名称,数据库名称是否正常

db.createUser({
user: "xxxxx",
pwd: "xxxxfdad",
roles: [
{ role: "nologin", db: "admin" }
]
})

暂无图片 评论
暂无图片 有用 0
云_2019
题主
2023-08-14
在系统里面有多个数据库即db,当前指定db为admin是可以创建用户即成功执行了上面语句工【db.createUser({user: "xxxxx",pwd: "xxxxfdad",roles: [{ role: "nologin", db: "admin" }]})】,如果是指定为其它的数据库时就会执行失败:No role named nologin@test 我在怀疑是不是mongodb的bug?
云_2019
题主
2023-08-14
如: mongos>use colxxxx mongos>db.createUser({ user: "xxxxx", pwd: "xxxxfdad", roles: [ { role: "nologin", db: "colxxxx" } ] }) { ......... "errmsg":"No roles named nologin@colxxxx", .......... } 还是mongodb自建的role不是共享的即只能由admin库单独使用?
伟鹏

或者创建role的时候在resource里指定一下DB?

暂无图片 评论
暂无图片 有用 0
云_2019
题主
2023-08-14
如果指定db的话,必须要指定action, 这个action的内容就不知道指定啥了?
伟鹏

use admin db.createRole({ role: "nologin", privileges: [ { resource: { db: "test", collection: "" }, actions: [ "find" ] } ], roles: [] })

暂无图片 评论
暂无图片 有用 0
云_2019
题主
2023-08-14
不行,就是让用户没有find。
伟鹏

use admin db.createRole({ role: "nologin", privileges: [], roles: [], authenticationRestrictions: [ { clientSource: [], serverAddress: [], serverCertificate: [] } ] }) 

use test db.createRole({ role: "nologin", privileges: [], roles: [], authenticationRestrictions: [ { clientSource: [], serverAddress: [], serverCertificate: [] } ] })

暂无图片 评论
暂无图片 有用 0
云_2019
题主
2023-08-14
感谢,已达到目的,但是不明白加上serverCertificate: []会报错,就加了前面2个参数就达到目的。
伟鹏

嗯, 忘了问你是否开启SSL/TLS.

serverCertificate 参数有个先决条件,在 MongoDB 中启用了 SSL/TLS 加密连接的情况下,才能使用该参数。

暂无图片 评论
暂无图片 有用 0
云_2019
题主
2023-08-15
明白了,感谢
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏