mongodb连接出错

明明db.auth返回1,可是mongo -u admin -p就是失败,为啥呢?

andyliwr@andyliwrPC:~/文档/xiaodiFTP/nodejs/xiaodiTodoList$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> use admin
switched to db admin
> db.auth("admin", "123456")
1
> db.auth("admin", "1234535")
Error: 18 { ok: 0.0, errmsg: "auth failed", code: 18 }
0
> exit
bye
andyliwr@andyliwrPC:~/文档/xiaodiFTP/nodejs/xiaodiTodoList$ mongo -u admin -p
MongoDB shell version: 2.6.10
Enter password: 
connecting to: test
2016-07-31T22:41:33.520+0800 Error: 18 { ok: 0.0, errmsg: "auth failed", code: 18 } at src/mongo/shell/db.js:1287
exception: login failed
回复
阅读 17.6k
3 个回答

和题主遇到了同样的问题,网上找了一圈靠谱的答案就一个,亲自尝试验证有效解决问题。这里说一下解决办法,帮助其他新人采坑,也为中文社区留下点又用的东西。

之所以有这个错误很大原因是因为你直接创建了一个roleroot的用户,然后使用这个user去做authentication登录。

Mongodb在第一次做authentication的时候,需要首先创建一个admin user,命令如下:

use admin
db.createUser(
  {
    user: "admin",
    pwd: "password",
    roles: [ { role: "root", db: "admin" } ]
  }
);
exit;

完成这一步操作之后,退出Mongodb,结束其进程,重新启动Mongodb: mongod --auth 或者 mongod -f path/to/configfile,用之前创建的user进行authentication验证登录

mongo -u admin -p password --authenticationDatabase admin

成功登录之后,再创建拥有其他role的其他user, 例如这里我创建一个有读写test数据库权限的testuser

use test
db.createUser(
  {
    user: "testuser",
    pwd: "test",
    roles: [ { role: "readWrite", db: "test" } ]
  }
);

之后通过创建的其他user再去做authentication登录的时候就不会再报以上的错误了。

这里的坑就在于,mongodb的官方文档上写着先创建一个{role: "userAdminAnyDatabase", db:""}的user,而实际上在开启验证模式的时候第一个需要创建的user是拥有root角色的admin,再通过admin去创建其他角色的用户。

这个问题唯一靠谱的答案在这里,英文好的同学可以直接去看原文

mongo localhost/admin -u admin -p
// or
mongo -u admin -p --authenticationDatabase admin

都是为了指定使用admin这个库中的用户来认证。有困难找文档,或者看一下--help。我机器上的是3.2,可能会和你的2.6有些出入。

$ mongo --help
MongoDB shell version: 3.2.6
usage: mongo [options] [db address] [file names (ending in .js)]
db address can be:
  foo                   foo database on local machine
  192.169.0.5/foo       foo database on 192.168.0.5 machine
  192.169.0.5:9999/foo  foo database on 192.168.0.5 machine on port 9999
Options:
  --shell                             run the shell after executing files
  --nodb                              don't connect to mongod on startup - no
                                      'db address' arg expected
  --norc                              will not run the ".mongorc.js" file on
                                      start up
  --quiet                             be less chatty
  --port arg                          port to connect to
  --host arg                          server to connect to
  --eval arg                          evaluate javascript
  -h [ --help ]                       show this usage information
  --version                           show version information
  --verbose                           increase verbosity
  --ipv6                              enable IPv6 support (disabled by default)
  --disableJavaScriptJIT              disable the Javascript Just In Time
                                      compiler
  --enableJavaScriptProtection        disable automatic JavaScript function
                                      marshalling
  --ssl                               use SSL for all connections
  --sslCAFile arg                     Certificate Authority file for SSL
  --sslPEMKeyFile arg                 PEM certificate/key file for SSL
  --sslPEMKeyPassword arg             password for key in PEM file for SSL
  --sslCRLFile arg                    Certificate Revocation List file for SSL
  --sslAllowInvalidHostnames          allow connections to servers with
                                      non-matching hostnames
  --sslAllowInvalidCertificates       allow connections to servers with invalid
                                      certificates
  --sslFIPSMode                       activate FIPS 140-2 mode at startup

Authentication Options:
  -u [ --username ] arg               username for authentication
  -p [ --password ] arg               password for authentication
  --authenticationDatabase arg        user source (defaults to dbname)
  --authenticationMechanism arg       authentication mechanism
  --gssapiServiceName arg (=mongodb)  Service name to use when authenticating
                                      using GSSAPI/Kerberos
  --gssapiHostName arg                Remote host name to use for purpose of
                                      GSSAPI/Kerberos authentication

你的用户是在admin这个数据库中的,而默认连接的数据库是test,自然认证会失败,你应该在使用mongo连接时指定数据库为admin,这样才能进行正确的认证:

mongo -u admin -p admin
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏