MongoDB-CR 认证失败

MongoDB-CR Authentication failed

我在验证用户时遇到以下错误:purchase_user@purchase 失败。 MongoDB-CR 验证失败。当我通过浏览器访问网络服务时,用户文档中缺少凭据。

但我能够从 mongo 验证 purchase_user returns 1 .

有同样的问题。我遇到的情况是,当我使用 MongoDB 3 创建我的用户时,它使用 SCRAM-SHA-1 作为身份验证机制而不是 MongoDB-CR。我必须做的是:

  1. 列表项
  2. 删除创建的用户。
  3. 修改集合 admin.system.version,使 authSchema 的 currentVersion 为 3 而不是 5(3 使用 MongoDB-CR)。
  4. 重新创建您的用户。

现在应该可以正常工作了。

上面的第 2 步没有明确详细说明,我找到了这个解决方案并且对我有用。

var schema = db.system.version.findOne({"_id" : "authSchema"})
schema.currentVersion = 3
db.system.version.save(schema)

我也遇到了这个错误。

检查您的 Spring 配置文件。我有一个名为 "MONGODB-CR" 的构造函数参数,我将其交换为 "SCRAM-SHA-1",它解决了我的问题。

跟踪 mongodb 日志文件帮助我诊断了这一点。

我认为这就是您需要的答案:

1) 在未启用身份验证的情况下启动 3.0。 (需要禁用授权,否则你会得到未授权的错误)。

2) 运行(选择"admin"use db后):

var schema = db.system.version.findOne({"_id" : "authSchema"})

schema.currentVersion = 3

db.system.version.save(schema)

3) 在启用身份验证的情况下重新启动 mongodb。

4) 创建一个新的管理员用户(旧的,您在此解决方法之前创建的那个将不起作用)。

现在一切正常。这个问题也让我发疯。

答案来自这里:https://jira.mongodb.org/browse/SERVER-17459

转到 mongoDB 控制台并删除您当前的用户并将 authSchema 版本设置为 3 而不是 5,在 mongo 控制台 -

中执行这些命令
mongo
use admin
db.system.users.remove({})    <== removing all users
db.system.version.remove({}) <== removing current version 
db.system.version.insert({ "_id" : "authSchema", "currentVersion" : 3 })

现在重新启动 mongod 并创建新用户然后它应该可以正常工作。

注意:仅在测试数据库中使用删除命令,如果在生产中使用更新。

Kubernetes Helm Chart 的身份验证信息

如果删除所有用户并在配置中启用身份验证(或在 Kubernetes helm 图表上默认设置的 --auth 参数),则无法再访问 MongoDB .它需要禁用身份验证,创建一个新用户,然后重新启用它。

在 Kubernetes 上,您需要编辑参数并添加 --noauth 作为参数,因为它不是经典安装 MongoDB 上的默认设置。有关 --noauth 和相应的 --auth.

的更多信息,请参阅 the CLI documentation

将 mongo-java-驱动程序升级到 3.0.3 并使用 :-

MongoCredential.createScramSha1Credential 而不是 MongoCredential.createMongoCRCredential

MongoCredential createMongoCRCredential = MongoCredential.createScramSha1Credential(mongoConfiguration.getDatabaseUserName(), mongoConfiguration.getAuthenticationDatabase(),mongoConfiguration.getDatabasePassword().toCharArray());

http://docs.mongodb.org/master/release-notes/3.0-scram/

可能是旧闻,问题已解决,但添加我遇到相同错误的经验:

我遇到了完全相同的问题(使用 MongoDB 3.0),并且 C# 驱动程序设置为使用 3.0 之前的数据库。

在 C# 中,我使用了 "MongoDB.Driver.CreateMongoCRCredentials()",这导致了 OP 出现错误。

修复(对我而言)是将上面的命令切换为 "MongoDB.Driver.CreateCredential()"。

我猜这可能是由于在升级的系统上使用 "old" 用户(从 3.0 之前的版本)造成的。这要么强制您将用户升级到新的身份验证机制,要么降级服务器上的身份验证机制。

将 Vivek 添加到上述解决方案并进行解释 from here

use admin
db.system.users.remove({})    <== removing all users
db.system.version.remove({}) <== removing current version 
db.system.version.insert({ "_id" : "authSchema", "currentVersion" : 3 })
  • 您只需降级架构即可创建 MONGODB-CR 个用户。 一旦他们在那里,旧的 drivers 将不管价值如何 authSchemaVersion 的。但是,如果您 运行 authSchemaUpgrade 进行更改 从“3”到“5”用户明显升级了
  • 我对新用户的评论是,如果你有现有的 SCRAM 用户并将架构手动更改为“3”用户文档不会 与新模式保持一致。但是,这不是强制执行的,但是 SCRAM 用户仍将为任何 driver 支持 SCRAM 的用户工作。

对我来说,我正在使用 mongo 2 客户端尝试连接到 mongo 3 服务器。升级客户端解决了这个问题。

我在使用新的 MongoDB 3.2.8 数据库的 Spring 启动应用程序中遇到了同样的错误。通过升级到最新版本的 Java Mongo 驱动程序 (3.2.2),然后将身份验证机制参数添加到我的 application.properties 中的 URI,我能够让它工作:

spring.data.mongodb.uri=mongodb://myusername:mypassword@localhost/?authSource=admin&authMechanism=SCRAM-SHA-1
spring.data.mongodb.database=test
  • 卸载 mongodb-clients 软件包 Ubuntu
  • 安装官方提供的mongodb-org-shellMongoDB

这解决了问题,因为 Ubuntu 提供的非官方 mongodb 包没有被 MongoDB 维护。您应该始终使用官方 MongoDB mongodb-org 软件包,这些软件包与最新的主要和次要 MongoDB 版本保持同步。

2018 年 6 月我在尝试从 /usr/bin 中安装的古老客户端连接到我的 Mongodb 版本 3.6 后收到此错误。我将 mongo 数据库安装在 OS 标准目录之外的单独文件夹中,因此我的安装与包管理器安装的旧版本冲突。

对于那些由于 not authorized on admin to execute commandremoving FeatureCompatibilityVersion document is not allowed 错误而在 MongoDB 3.6 中努力更新身份验证模式(参见 )的人来说,这是有效的对我来说。

解决第一个错误:

> db.system.version.remove({})
WriteResult({
        "writeError" : {
                "code" : 13,
                "errmsg" : "not authorized on admin to execute command { update: \"system.version\", ordered: true, lsid: { id: UUID(\"58e86006-d889-440a-bd83-ad09fcd81747\") }, $db: \"admin\" }"
        }
})

我必须创建一个允许对任何资源和具有此角色的用户执行任何操作的自定义角色,然后使用该新用户登录管理数据库:

mongo admin

db.createUser({user: 'admin', pwd: 'mypwd', roles: ['root']})
exit

mongo admin -u admin -p

db.createRole({role: 'fullaccess', privileges: [{resource: {anyResource: true}, actions: ["anyAction"]}], roles: []})
db.createUser({user: 'superadmin', pwd: 'mypwd', roles: ['fullaccess']})
exit

mongo admin -u superadmin -p

(仅使用具有 root 角色的 admin 用户或在配置中禁用 security.authorization 对我不起作用并且在尝试时仍然出现相同的错误更新 system.version table.)

之后我遇到了 另一个错误:

> db.system.version.remove({})
WriteResult({
        "nRemoved" : 0,
        "writeError" : {
                "code" : 40670,
                "errmsg" : "removing FeatureCompatibilityVersion document is not allowed"
        }
})

要解决它,我们应该只更新 authSchema 文档而不是删除整个集合。

(一般来说,您不应该盲目地从生产系统 table 中删除所有内容,并始终检查更新它们的含义,因此这是更新只需要记录。)

db.system.version.update({"_id": "authSchema"}, {currentVersion: 3})

现在您应该能够使用旧的身份验证机制创建用户。您可能还需要先切换到您的数据库,以便在该数据库而不是 admin 数据库中创建用户。否则,您必须在连接字符串中使用 authSource=admin 参数。

(我实际上躺在这里 - 它仍然会在 admin 数据库中创建,只是使用 mydb.myuser id 而不是 admin.myuser。但我使用MongoDB 文档中描述这些东西的方式相同。我想这就是它在以前版本中实际使用的方式,通常我们不应该关心内部实现细节。)

use mydb
db.createUser({user: 'myuser', pwd: 'mypwd', roles: [{role: 'dbOwner', db: 'mydb'}]})

别忘了清理:

use admin
db.system.version.update({"_id": "authSchema"}, {currentVersion: 5})
exit

mongo admin -u admin -p

db.dropUser('superadmin')
db.dropRole('fullaccess')

您可能希望保留 admin 用户 - 即使禁用了 security.authorization 设置,我也无法再次创建它。看起来如果 admin.system.users table 中有任何记录,该设置将不再起作用并且 mongo 需要身份验证才能执行某些操作。