Mongo用户权限允许读写任何数据库。

13

我是MongoDB的新手。我已经安装了MongoDB,并想创建一个用户,让该用户能够读写所有四个数据库。我尝试了以下命令:

use admin;
db.addUser({user: "foo" , pwd: "bar", roles: [  "readWriteAnyDatabase" ]})

但是当我尝试去做的时候

mongo someotherdb -u foo -p

当我使用正确的密码进行身份验证时,它会给我一个身份验证错误。

我还尝试通过执行以下操作手动将用户添加到其他数据库中

use someotherdb
db.addUser({user: "foo", roles: ['readWrite'], userSource: "admin"});

仍然无法通过mongo shell登录或在目标数据库中使用auth命令进行登录。

我做错了什么吗?如何创建一个可以全局读写任何数据库的用户?您是否必须将该用户添加到每个数据库的system.users集合中,或者如果他们拥有“readWriteAnyDatabase”角色,则不需要这样做?

我正在使用Ubuntu上的Mongo 2.4。


命令中有一个错别字,请使用管理员账户。您确定已创建用户吗?请使用以下命令进行检查:use admin; db.system.users.find()。一旦确认已创建用户,您可以使用mongo localhost:port/admin -u foo -p bar进行登录。(很遗憾,只能使用在admin数据库中创建的用户进行身份验证) - attish
哎呀,是的,用户已成功创建并可以登录到管理员数据库。 - JoeyP
那么,答案是只有readWriteAnyDatabase角色无法让我连接到Mongo实例中的其他数据库吗? - JoeyP
并不是这个意思。它的意思是您需要进行身份验证,但之后您将能够连接。 (我的理解是,您需要对会话进行身份验证,该会话能够访问其他数据库,在这种情况下只需在管理数据库上进行身份验证) - attish
你解决过这个问题吗?我也遇到了同样的问题。我已经设置了readWriteAnyDatabase,可以在mongo shell中切换数据库,但无法在mongo driver中切换(会出现认证失败错误),或者直接连接除admin以外的任何数据库。 - Dave
1个回答

26

所以,我终于弄清楚了。请注意,这个修复方法仅适用于Mongo 2.4。

在2.4中,你可以在连接字符串或命令行中指定要使用的数据库进行身份验证。

因此,要创建初始用户:

use admin
db.createUser({user: "foo" , pwd: "bar", roles: [  "userAdminAnyDatabase","readWriteAnyDatabase" ]})

并且进行身份验证使用

mongo -u foo --authenticationDatabase admin -p

现在你应该能够对任何数据库做你想要的事情了


1
有没有办法跳过“--authenticationDatabase”选项?如何在php MongoClient类中使用它?Robomongo GUI?MongoVUE GUI? - Lukas Liesis
如果您没有使用authenticationDatabase选项,则需要连接到admin数据库并使用db.auth(...)进行身份验证。 - iMoses
如果我想给特定的数据库读写权限怎么办? - Sunil Sharma
@LukasLiesis 我对这个还比较新,但是看起来你可以通过将认证数据库作为第一个参数传递来隐式地使用该选项。不确定你是在寻找这个选项还是完全消除数据库名称。mongo admin -u 'USERNAME' -p - WAF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接