【问题标题】:MongoDB: set user/password to access to dbMongoDB:设置用户/密码以访问数据库
【发布时间】:2012-11-30 18:33:02
【问题描述】:

我正在尝试为 mongodb 设置密码,以防止使用空登录名和密码访问 db(默认设置)。

我正在设置 mongo 服务器:

sudo ./mongod

启动客户端:

./mongo

设置密码:

use admin
db.addUser("root", "root")
exit

输出是:

MongoDB shell version: 2.2.0
connecting to: test
> use admin
switched to db admin
> db.addUser("root", "root")
{
    "user" : "root",
    "readOnly" : false,
    "pwd" : "2a8025f0885adad5a8ce0044070032b3",
    "_id" : ObjectId("50c90b94e28c41a388104f64")
}
> exit

但是,当我尝试使用空凭据进行身份验证时(我使用 mViever 管理 UI),它仍然有效。否则,无法使用 root/root 访问。我做错了什么?

也试过用-auth参数启动mongo服务器,结果一样:

./mongod -auth

UPD: 以-auth 参数启动后,任何密码都无法登录。获取:

Thu Dec 13 03:27:38 uncaught exception: error {
    "$err" : "unauthorized db:admin ns:admin.system.users lock type:1 client:127.0.0.1",
    "code" : 10057
}

更新:我不知道发生了什么......

> db.auth("root","root");
1
> ^C
bye

它可以登录。让我们重启./mongod --auth./mongo

MacBook-Pro-Ilya:bin ilyarusanen$ ./mongo
MongoDB shell version: 2.2.2
connecting to: test
> db.auth("root","root")
Error: { errmsg: "auth fails", ok: 0.0 }
0
> db.test.insert({"yeah":"2342"})
Fri Dec 14 08:52:05 uncaught exception: getlasterror failed: { "errmsg" : "need to login", "ok" : 0 }
> use admin
switched to db admin
> db.addUser("root","root")
Fri Dec 14 08:52:14 uncaught exception: error {
    "$err" : "unauthorized db:admin ns:admin.system.users lock type:1 client:127.0.0.1",
    "code" : 10057
}
> db.auth("root","root")
1

为什么一开始可以登录?为什么重新启动mongo后无法登录?为什么在尝试添加用户失败后,它变得能够登录?谢谢。

UPDATE2:MongoHub 似乎验证正常。但是,从 NodeJS 我仍然无法登录:我使用这样的代码:

mongo_db.open(function(err,data){
  if(data){
    data.authenticate("root", "root",function(err2,data2){
         if(data2){
             console.log("Database opened");
         }
         else{
             console.log(err2);
         }
    });
  } else {
       console.log(err);
  }
});

我得到:

{ [MongoError: auth fails] name: 'MongoError', errmsg: 'auth fails', ok: 0 }

但要提一下,具有相同凭据的 MongoHub 可以正常工作。

【问题讨论】:

  • 您正在创建一个管理员用户,您是否在管理员数据库上使用db.auth("root","root")?如您所见,您需要使用--auth 重新启动该过程才能启用身份验证。
  • 实际上,在切换到 -auth 选项后,我什至无法访问 mongo。我得到:未知主机。请检查 MongoDB 是否在给定的主机和端口上运行!错误。但是 mongo 在 27017 上运行,如果我关闭 -auth,它会照常工作(但是,我有一个新数据库“admin”)
  • 我使用了this 教程并且对此没有任何问题。如果您尝试从 localhost 连接,请查看 this 指令。

标签: mongodb authentication passwords


【解决方案1】:

从您的评论中您提到您正在使用 mViewer。 mViewer 0.9.1 版不支持身份验证。根据 mViewer GitHub 上的this issue,此问题已在 0.9.2 版本中得到解决,该版本计划于 10 月发布。

在使用身份验证启动节点之前,登录到节点并添加用户。然后用--auth 启动节点并连接到没有mViewer 的shell。

此时您可以连接到管理员数据库并验证您的管理员用户:

use admin
db.auth('root', 'root')

由于您设置了一个可以访问所有数据库的管理员用户,因此您需要针对管理员数据库进行身份验证。完成此操作后,您将可以访问所有数据库。您还可以在任何数据库上创建新用户,或为所有数据库创建新的只读用户。

如果您创建一个只能访问一个数据库的新用户,该用户需要use 该数据库和db.auth(name, pass) 反对它。

如果您创建一个对所有数据库具有只读访问权限的新用户,他们将通过use admindb.auth(name, pass) 获得对所有数据库的只读访问权限

您可以找到有关设置身份验证here 的更多信息以及有关设置用户here 的更多信息

注意:当您启动一个节点没有 --auth 时,不会启用任何身份验证。这意味着您可以与 shell 和db.auth('root','root') 连接,但就访问而言,它不会做任何事情。 MongoDB 不会拒绝没有--auth 命令行选项的数据库访问(--keyFile 在分片设置或副本集中)

【讨论】:

  • 是的,我当前的版本是 mViewer-v0.9.1,因为他们官方 github 上唯一可用的版本是 0.9.1。感谢您的评论,我会尝试另一个 UI,稍后再写。
  • 如果你不使用mViewer,你能连接和认证吗?此外,如果您需要 mViewer,您可以克隆 GitHub 存储库并构建最新版本。
  • 好吧,如果我启动 mongo,然后写: > db.auth("root","root");它返回给我 1。它成功地完成了身份验证过程,是吗?
  • 我已经更新了答案,但基本上第一个问题是您正在尝试对测试数据库进行身份验证 - 管理员用户对管理数据库进行身份验证。
  • 谢谢,我知道了。要访问我的数据库,我应该登录,使用 use 切换到我的数据库,为此数据库添加用户。
猜你喜欢
  • 2014-09-04
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 2011-03-11
相关资源
最近更新 更多