MongoDB-CR身份验证失败

时间:2015-03-12 10:11:07

标签: mongodb spring-data-mongodb

我在验证用户身份时收到以下错误:purchase_user @ purchase failed。 MongoDB-CR身份验证失败。当我通过浏览器访问webservice时,缺少用户文档中的凭据。

但是我可以从mongo验证purchase_user,它返回1。

13 个答案:

答案 0 :(得分:83)

转到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并创建新用户然后它应该可以正常工作。

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

答案 1 :(得分:20)

有同样的问题。发生在我身上的是当我使用MongoDB 3创建我的用户时,它使用SCRAM-SHA-1作为它的认证机制而不是MongoDB-CR。我必须做的是:

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

答案 2 :(得分:17)

上面的步骤2没有明确详细说明,我找到了这个解决方案并为我工作。

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

答案 3 :(得分:10)

我认为这是你需要的答案:

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

2)运行(选择&#34; admin&#34;使用db):

  

var schema = db.system.version.findOne({&#34; _id&#34;:&#34; authSchema&#34;})

     

schema.currentVersion = 3

     

db.system.version.save(模式)

3)启用auth启动mongodb。

4)创建一个新的管理员用户(旧的管理员用户,在此变通办法获胜之前创建的用户)。

现在应该有用了。这个问题也让我发疯了。

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

答案 4 :(得分:8)

Vivek&amp;添加到上述解决方案解释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用户。 一旦他们在那里,旧的司机将无论价值如何都会工作 authSchemaVersion。但是,如果您运行authSchemaUpgrade进行更改 从“3”到“5”,用户显然会升级。
  • 我对新用户的评论是,如果您有现有的SCRAM 用户并手动将架构更改为“3”,用户文档不会 与新架构保持一致。但是,这并没有强制执行 SCRAM用户仍可以使用任何支持SCRAM的驱动程序。

答案 5 :(得分:3)

将mongo-java-driver升级到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/

答案 6 :(得分:2)

对我来说,我使用mongo 2客户端试图连接到mongo 3服务器。升级客户端修复了问题。

答案 7 :(得分:1)

  • 卸载Ubuntu提供的 mongodb-clients 程序包
  • 安装 mongodb-org-shell 由官方MongoDB提供

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

答案 8 :(得分:0)

我也遇到了这个错误。

检查你的Spring Config文件..我有一个名为&#34的构造函数arg; MONGODB-CR&#34;我交换到&#34; SCRAM-SHA-1&#34;它解决了我的问题。

拖尾mongodb日志文件帮我诊断了这个。

答案 9 :(得分:0)

可能是旧的新闻,问题已经解决了,但是添加了我的经验同样的错误:

我遇到了完全相同的问题(使用MongoDB 3.0),以及设置为使用3.0 db前的C#驱动程序。

在C#中,我使用了&#34; MongoDB.Driver.CreateMongoCRCredentials()&#34;,这导致了OP的错误。

修复(对我而言)是将上面的命令切换到&#34; MongoDB.Driver.CreateCredential()&#34;。

我想这可能是因为使用&#34; old&#34;升级系统上的用户(来自3.0之前版本)。这会强制您将用户升级到新的身份验证机制,或者降级服务器上的身份验证机制。

答案 10 :(得分:0)

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

答案 11 :(得分:0)

对于那些由于not authorized on admin to execute commandremoving FeatureCompatibilityVersion document is not allowed错误而在MongoDB 3.6中努力更新身份验证架构(请参阅accepted answer)的人来说,这就是对我有用的。

要解决第一个错误

> 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

(仅使用具有admin角色的root用户或在配置中禁用security.authorization对我不起作用,并且在尝试更新{ {1}}表。)

此后,我又遇到了另一个错误

system.version

要解决该问题,我们应该只更新> db.system.version.remove({}) WriteResult({ "nRemoved" : 0, "writeError" : { "code" : 40670, "errmsg" : "removing FeatureCompatibilityVersion document is not allowed" } }) 文档,而不要删除整个集合。

(通常,您不应该盲目地从生产中的系统表中删除所有内容,并且始终检查更新它们的含义,这是仅更新所需记录的另一个原因。)

authSchema

现在您应该能够使用旧的身份验证机制创建用户。您可能还需要先切换到数据库,以便在该数据库中而不是在db.system.version.update({"_id": "authSchema"}, {currentVersion: 3}) 中创建用户。否则,您必须在连接字符串中使用admin参数。

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

admin.myuser

并且不要忘记进行清理

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表中是否有任何记录,该设置不再起作用,并且mongo需要身份验证才能执行某些操作。

答案 12 :(得分:-1)

使用新的MongoDB 3.2.8数据库的Spring Boot应用程序出现了同样的错误。通过升级到最新版本的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