MongoDB 客户端访问控制:SCRAM-SHA-1 身份验证失败,storedKey 不匹配

Posted

技术标签:

【中文标题】MongoDB 客户端访问控制:SCRAM-SHA-1 身份验证失败,storedKey 不匹配【英文标题】:MongoDB Client Access Control: SCRAM-SHA-1 authentication failed, storedKey mismatch 【发布时间】:2016-10-15 03:04:51 【问题描述】:

我正在尝试在本地 Mongo 安装上激活用户授权,但身份验证不断失败。可能是什么问题?我错过了什么吗?

我按照“Installing on Windows”和“Enable Client Access Control”中列出的步骤进行操作:

1) 添加了一个用户

>mongo admin
MongoDB shell version: 3.2.7
connecting to: admin
> db.createUser(createUser:"admin",pwd:"admin",roles:["root"])
Successfully added user:  "createUser" : "admin", "roles" : [ "root" ] 
>

2) 在mongod.cfg 中启用客户端访问控制:

systemLog:
    destination: file
    path: c:\data\log\mongod.log
storage:
    dbPath: c:\data\db
security:
    authorization: enabled

3) 重启mongod

4) 现在使用“正确”凭据(我刚刚指定的凭据)登录总是失败:

>mongo admin -u admin -p admin
MongoDB shell version: 3.2.7
connecting to: admin
2016-06-14T12:25:02.376+0200 E QUERY    [thread1] Error: Authentication failed. :
DB.prototype._authOrThrow@src/mongo/shell/db.js:1441:20
@(auth):6:1
@(auth):1:2

exception: login failed

日志文件中的错误是:SCRAM-SHA-1 authentication failed for admin on admin from client 127.0.0.1 ; AuthenticationFailed: SCRAM-SHA-1 authentication failed, storedKey mismatch

平台是 Windows 10 x64,如果这很重要的话。 带有 OpenSSL 的 MongoDB 64 位 3.2.7。

【问题讨论】:

【参考方案1】:

作为per the documentation,传递给createUser 的对象应该包含user 属性(以及其他属性):

db.createUser( user : "admin", pwd : "admin", roles : ["root"] )
                ^^^^ not `createUser`

【讨论】:

即使在使用上述 sytanx 进行用户创建后,我也会遇到同样的错误。能够使用具有 previligese roles: [ role: "root", db: "admin"] 的 rootadmin 用户登录,但与我在特定数据库上提供访问权限的其他用户有问题,如下所示:[ role: "dbOwner", db: "DB_ANME", role: "readWrite", db: "DB_NAME" 没关系,问题在于密码中的“$”字符。所以,当我从终端尝试时,它应该被转义;)。 我的密码中实际上有一个“@”。即使我试图逃避,它也没有奏效。我改为更改密码。 密码中的“@”无法正常工作的问题可能是由于 URL 编码无效,如 here 所述。【参考方案2】:

您可能正在尝试使用新的登录名和/或密码重新创建数据库。因此,您需要排除“/db”文件夹。数据库路径在 docker-compose.yml 文件中。例如:“卷:- ./db:/data/db”。

【讨论】:

【参考方案3】:

如果有人带着错误信息来到这里,这可能会有所帮助:

MongoDB 无法处理多个符号;

Windows 数据库名称限制 对于在 Windows 上运行的 MongoDB 部署,数据库名称不能包含以下任何字符:

/\. "$*<>:|?

数据库名称也不能包含空字符。

Unix 和 Linux 系统的数据库名称限制 对于在 Unix 和 Linux 系统上运行的 MongoDB 部署,数据库名称不能包含以下任何字符:

/\. "$

https://docs.mongodb.com/manual/reference/limits/#Restrictions-on-Field-Names

我在使用 mongoengine 和 pymongo 时遇到错误“身份验证失败”。

包含符号时​​请更改密码。

【讨论】:

【参考方案4】:

我相信您在 db.createUser 上输入的 password 与您在 mongo 控制台中提示 Enter password 时输入的不匹配。您可以尝试删除用户:db.dropUser('userName') 并重新创建用户。请务必记住正确的密码。

【讨论】:

以上是关于MongoDB 客户端访问控制:SCRAM-SHA-1 身份验证失败,storedKey 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 无法从 Heroku 连接到 mongodb 3 到 Mongolab:SCRAM-SHA-1

mongodb 错误 SCRAM-SHA-1 authentication failed for --转

mongo-cxx-driver-legacy-1.1.2 SCRAM-SHA-1身份验证错误

MongoDBMongoDB 3.2 SCRAM-SHA-1验证方式

MongoDB 访问权限控制

mongodb之用户/认证/角色/权限管理