Mongodb 找不到用户“user@database”

Sim*_*leJ 1 mongodb

我正在尝试允许 mongo 用户连接到 mongo 数据库,但无论我给用户什么角色,身份验证都失败并在日志中显示此错误:

2019-08-09T17:03:05.486+0000 I ACCESS   [conn13] SCRAM-SHA-1 authentication failed for username on dbname from client 127.0.0.1:38790 ; UserNotFound: Could not find user username@dbname
2019-08-09T17:03:05.488+0000 I NETWORK  [conn13] end connection 127.0.0.1:38790 (0 connections now open)
Run Code Online (Sandbox Code Playgroud)

以下是内容 /etc/mongodb.conf

# mongodb.conf

# Where to store the data.
dbpath=/var/lib/mongodb

#where to log
logpath=/var/log/mongodb/mongodb.log

logappend=true

bind_ip = 0.0.0.0
port = 27017

# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
journal=true

auth=true
Run Code Online (Sandbox Code Playgroud)

这是我创建用户的方式:

db.createUser({
  user: "username",
  pwd: "secret",
  roles: [
    { role: "userAdmin", db: "dbname" },
    { role: "dbAdmin",   db: "dbname" },
    { role: "readWrite", db: "dbname" }
  ]
});
Run Code Online (Sandbox Code Playgroud)

我还将该dbOwner角色授予了数据库上的用户dbname。这里发生了什么?如果用户是所有者并且具有读/写权限,为什么我无法连接到数据库?我必须创建一个名称为 的用户username@dbname吗?

编辑:刚刚尝试使用 username 添加用户username@dbname,但该用户也无法连接。

我还可以使用相同的命令连接到 mongo 减去/dbname末尾的 ,然后运行use dbname. 我不知道为什么这会起作用,但直接连接不会。

Ada*_*son 14

问题是数据库用户是在数据库上创建的,admin而不是dbname.

/dbname从连接字符串 / mongo shell / 等中省略意味着连接字符串将对admin数据库进行身份验证。引用文档:

如果未指定“/database”并且连接字符串包含凭据,则驱动程序将对管理数据库进行身份验证

https://docs.mongodb.com/manual/reference/connection-string/#components)。

如果/dbname已定义,则dbname除非将authSource参数配置为指定用户所在的数据库,否则连接字符串将对其进行身份验证。

您可以确认这是通过添加的情况下authSource=admin连接字符串或--authenticationDatabase admin蒙戈shell命令

或者,您可以使用db.getUsers()来查看创建用户的数据库。


Moh*_*imi 5

我遇到了同样的错误,我的解决方案是添加?authSource=admin到连接字符串的末尾:

MONGODB_URI="mongodb://username:password@localhost:27017/db_name?authSource=admin"
Run Code Online (Sandbox Code Playgroud)