MongoDB:设置用户/密码以访问db

f1n*_*1nn 13 authentication passwords mongodb

我正在尝试为mongodb设置密码以防止使用空登录和传递(默认设置)访问数据库.

我是statring mongo服务器:

sudo ./mongod
Run Code Online (Sandbox Code Playgroud)

启动客户:

./mongo
Run Code Online (Sandbox Code Playgroud)

设置密码:

use admin
db.addUser("root", "root")
exit
Run Code Online (Sandbox Code Playgroud)

输出是:

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
Run Code Online (Sandbox Code Playgroud)

不过,当我尝试使用空凭据进行身份验证时(我使用mViever管理界面),它仍然有效.否则,使用root/root访问不可用.我做错了什么?

还尝试用-auth参数启动mongo服务器,结果相同:

./mongod -auth
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

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

> db.auth("root","root");
1
> ^C
bye
Run Code Online (Sandbox Code Playgroud)

它可以登录.让我们重启./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
Run Code Online (Sandbox Code Playgroud)

为什么一开始它可以登录?为什么重启mongo后无法登录?为什么在FAILED尝试添加用户之后,它能够登录?谢谢.

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);
  }
});
Run Code Online (Sandbox Code Playgroud)

我得到:

{ [MongoError: auth fails] name: 'MongoError', errmsg: 'auth fails', ok: 0 }
Run Code Online (Sandbox Code Playgroud)

但请注意,具有相同凭据的MongoHub工作正常.

And*_*ere 8

根据您的评论,您提到您正在使用mViewer.mViewer 0.9.1版不支持身份验证.根据mViewer GitHub上的这个问题,这在0.9.2版本中得到了解决,该版本的目标是在10月发布.

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

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

use admin
db.auth('root', 'root')
Run Code Online (Sandbox Code Playgroud)

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

如果您创建的新用户只能访问一个数据库,则该用户需要use该数据库并且需要该数据库db.auth(name, pass).

如果您创建具有读取所有数据库只访问一个新的用户,他们会use admindb.auth(name, pass)得到他们只读到所有数据库的访问

您可以在此处找到有关设置身份验证的详细信息以及有关在此处设置用户的详细信息

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