我试图允许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)
以下是/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
这是我创建用户的方式:
db.createUser({
user: "username",
pwd: "secret",
roles: [
{ role: "userAdmin", db: "dbname" },
{ role: "dbAdmin", db: "dbname" },
{ role: "readWrite", db: "dbname" }
]
});
我还向数据库dbOwner
上的用户授予了dbname
角色。这是怎么回事如果用户是所有者并且具有读/写权限,为什么不能连接到数据库?我必须创建一个名称为username@dbname
的用户吗?
编辑:刚尝试添加用户名username@dbname
的用户,但该用户也无法连接。
我还可以使用相同的命令连接到mongo,最后减去/dbname
,然后运行use dbname
。我不知道为什么这行得通,但是直接连接却不行。
答案 0 :(得分:1)
问题在于数据库用户是在admin
数据库而不是dbname
上创建的。
从连接字符串/ mongo shell等中省略/dbname
意味着连接字符串将向admin
数据库进行身份验证。引用文档:
如果未指定'/ database'并且连接字符串包括 凭据,驱动程序将向管理数据库进行身份验证
(https://docs.mongodb.com/manual/reference/connection-string/#components)。
如果定义了/dbname
,则除非将authSource参数配置为指定用户所在的数据库,否则连接字符串将根据dbname
进行身份验证。
您可以通过将authSource=admin
添加到连接字符串或将--authenticationDatabase admin
添加到mongo shell command来确认是这种情况。
或者,您可以使用db.getUsers()
查看在其中创建用户的数据库。