【问题标题】:Issue with mongodb user authenticationmongodb用户身份验证问题
【发布时间】:2015-09-30 05:31:34
【问题描述】:

我正在尝试从 SERVER-1 连接到我的 mongo 服务器,该服务器在其他服务器 SERVER-2 中运行 所以我的 grails 应用程序在 SERVER-1 中运行。所以我给了这样的外部配置。

grails {
    mongo {
        host = "<SERVER-2>-host"
        port = 27017
        username = "myapp"
        password = "myapp"
        databaseName = "myapp"
        options {
            autoConnectRetry = true
            connectTimeout = 3000
        }
    }
}

在 SERVER-2 中,我创建了 myapp db 并使用相同的用户和凭据

use myapp
db.createUser( { "user" : "myapp",
                 "pwd": "myapp",
                 "roles" : [] },
               { w: "majority" , wtimeout: 5000 } )

并且能够看到如下用户列表

> db.getUsers()
[
    {
        "_id" : "myapp.myapp",
        "user" : "myapp",
        "db" : "myapp",
        "roles" : [ ]
    }
]

Mongo 配置包含“noauth=true”, 从 SERVER-1,我可以使用以下命令连接到 SERVER-2 mongo

mongo SERVER-2-HOST:27017/myapp  -u myapp -p myapp

但是当我尝试从 SERVER-1 grails 应用程序连接时,它给出了以下错误

| Error Error executing script LoadVars: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'mongoTransactionManager' while setting constructor argument with key [1]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoTransactionManager': Cannot resolve reference to bean 'mongoDatastore' while setting bean property 'datastore'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoDatastore': FactoryBean threw exception on object creation; nested exception is org.springframework.data.mongodb.CannotGetMongoDbConnectionException: Failed to authenticate to database [myapp], username = [myapp], password = [m***p]

我的 mongod.conf 文件

# mongod.conf

logpath=/var/log/mongodb/mongod.log

logappend=true

fork=true

#port=27017

dbpath=/var/lib/mongo

pidfilepath=/var/run/mongodb/mongod.pid

# Listen to local interface only. Comment out to listen on all interfaces.
#bind_ip=127.0.0.1

# nojournal=true

#cpu=true

#noauth=false
auth=true

我错过了什么吗?

【问题讨论】:

  • 您使用的是 MongoDB 3 和 Grails 2.4.x 还是 2.5.x?
  • 如果是,请参阅我的更新答案。那一定是你的问题。

标签: mongodb grails


【解决方案1】:

看起来您的 MongoDB 服务器正在运行并正常侦听,但无法进行身份验证。

我看到的第一个问题是,您提到您的 Grails 应用程序在第一台服务器上运行,而您的 MongoDB 服务器在第二台服务器上,但是您的 DataSource.groovy 配置中的 host 配置为连接到第一台服务器主持人,不是第二位。只是在示例中还是您的代码真的连接到第一台服务器(这是错误的)?请验证。

第二个问题可能与您将用户添加到数据库名称myapp 的方式有关。请按照以下步骤连接后重试:

1) 在第二台主机上登录 MongoDB 实例:mongo
2) 使用您的数据库use myapp
3) 通过运行 db.dropUser("myapp") 验证您没有任何名为 myapp 的用户
4) 现在添加用户:

db.createUser({
    user: "myapp",
    pwd: "myapp",
    roles: [ "readWrite", "dbAdmin" ]
});

现在连接您的 Grails 应用程序。

更新

如果您使用的是 MongoDB 3.x 和 Grails 2.5.x 或 2.4.x,那么这应该是您的身份验证失败的问题。我差点忘了告诉你这个问题。

Grails 以某种方式发布了旧版本的 Java 驱动程序,即 2.12.3,并且为了支持 MongoDB 3,我们至少需要 Java 驱动程序的 2.13.x。此外,3.0 Java 驱动程序不是 MongoDB 3.0 的必需升级。 2.13.0 版本是与 MongoDB 3.0 完全兼容所需的最低版本。

https://github.com/mongodb/mongo-java-driver/releases/tag/r3.0.0

所以,在你的BuildConfig.groovy 中添加这个dependency

dependencies {
    compile "org.mongodb:mongo-java-driver:2.13.1"
}

另外,如果您使用的是 Grails mongeez 插件,请从那里排除 java 驱动程序:

compile (":mongeez:0.2.3") {
    excludes("mongo-java-driver")
}

我将在 Grails 中为此创建一个票证。希望这会有所帮助!

【讨论】:

  • 是的,Shashank,感谢您的回复。该 URL 指向 SERVER-2 本身(这是我的拼写错误)并且我删除了旧用户,并使用您提到的上述命令创建了新用户。而且我能够从 SERVER-1 命令行连接到 SERVER-2,使用下面的命令 mongo SERVER-2-HOST:27017/myapp -u myapp -p myapp 但仍然无法从 SERVER- 连接到 SERVER-2 1 个 grails 应用程序
  • 如果方便,请您粘贴您的mongod.conf(可能是/etc/mongod.conf
  • 我添加了配置文件,请检查
  • 能否请您评论一下auth=true,重启MongoDB实例并尝试重新连接Grails应用?
【解决方案2】:

创建特定于数据库的真实用户:
1.从cmd运行mongod
2.从cmd运行mongo
3. 使用“your_db_name”
4.

db.createUser(
      {
        user: "anik",
        pwd: "password",
        roles: [ { role: "dbOwner", db: "your_db_name" } ]
      }
    ) 

记下数据库名称。插入 urs。
5.mongo "your_db_name" -u anik -p password
6. 切换到您的收藏 bson 文件夹
7.mongorestore -d ss "abc.bson"

身份验证后,您可以使用项目属性文件中的用户名密码连接到 db。

【讨论】:

  • 嗨@Istiak Morsalin,感谢您的回复。根据您的评论,我只错过了“dbOwner”这个角色。所以我也给了。所以现在我仍然无法从 grails 应用程序连接。在我的 mongodb 配置文件中,我注释掉了“bind_ip”配置以启用所有端口。这是导致问题的原因吗?
  • 您必须通过运行 mongo 199.21.114.XX 指定 IP (199.21.114.XX)。否则,如果您还希望它在 localhost 上侦听,则应删除配置文件中的 bind_ip 设置。更新检查您的防火墙配置。由于您要连接到外部 IP,因此可以将其配置为阻止,即使是从本地框。
【解决方案3】:

我的设置有问题。 实际上我使用的是 grails mongo 3.0.0 版 我安装了 MongoDB 3.0.0。所以根据这个grails mongo documentation,grails mongo 3.0.0 插件只支持 MongoDB 2.6。但我使用的是 3.0.0(升级版)。 检查这个。 https://github.com/grails/grails-data-mapping/issues/557 所以现在 MongoDB 3.0 不支持 SCRAM-SHA-1 authSchema。所以我们应该使用其他一些技术来验证我们的用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 2017-02-08
    • 2016-11-27
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    相关资源
    最近更新 更多