【问题标题】:Mongoengine - command find requires authenticationMongoengine - 命令查找需要身份验证
【发布时间】:2019-07-20 16:23:11
【问题描述】:

我不熟悉将 Mongoengine 与经过身份验证的 MongoDB 一起使用。

我有一个名为“gambit_test”的 Mongo 数据库。我已经启用了身份验证,并且我有一个适当的用户,我可以在数据库中进行身份验证以执行读取和写入。

我在 Mongo 客户端中使用以下命令为“gambit_test”创建了用户:

use gambit_test
db.createUser({
    user: "gambit_admin",
    pwd: "xxxxxx",
    roles:[{role: "userAdmin" , db:"admin"}]
})

当我登录 MongoDB 检查我的用户状态时,我使用如下命令(以超级管理员身份登录):

mongo -u sup_admin -p yyyyyyyy

为了验证我的用户状态,这是我运行的:

use gambit_test
show users

它返回以下内容:

{
    "_id" : "gambit_test.gambit_admin",
    "user" : "gambit_admin",
    "db" : "gambit_test",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "gambit_test"
        },
        {
            "role" : "dbAdmin",
            "db" : "gambit_test"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}

在我的 Python test.py 代码中,我正在执行以下操作:

from mongoengine import *

class History(Document):
    name = StringField(required=True)

if __name__ == "__main__":
    try:
        connect('gambit_test')
        History.objects().get()
    except Exception as e: 
        connect(host='mongodb://gambit_admin:xxxxxx@localhost' + 
        ':27017/gambit_test')
        History.objects().get()

当我尝试运行上述 python 代码时,我收到以下错误:

Traceback (most recent call last):
  File "test.py", line 12, in <module>
    History.objects().get()
  File "/home/ubuntu/gambit/genv/lib/python3.6/site-packages/mongoengine/queryset/base.py", line 267, in get
    result = six.next(queryset)
  File "/home/ubuntu/gambit/genv/lib/python3.6/site-packages/mongoengine/queryset/base.py", line 1484, in __next__
    raw_doc = six.next(self._cursor)
  File "/home/ubuntu/gambit/genv/lib/python3.6/site-packages/pymongo/cursor.py", line 1189, in next
    if len(self.__data) or self._refresh():
  File "/home/ubuntu/gambit/genv/lib/python3.6/site-packages/pymongo/cursor.py", line 1104, in _refresh
    self.__send_message(q)
  File "/home/ubuntu/gambit/genv/lib/python3.6/site-packages/pymongo/cursor.py", line 982, in __send_message
    helpers._check_command_response(first)
  File "/home/ubuntu/gambit/genv/lib/python3.6/site-packages/pymongo/helpers.py", line 155, in _check_command_response
    raise OperationFailure(msg % errmsg, code, response)
  pymongo.errors.OperationFailure: command find requires authentication

我不知道为什么会这样。原因是我可以使用 Mongo 客户端执行正常的 find() 和 insert() 。但是,当我使用 Mongoengine 时,事情就崩溃了……

非常感谢任何帮助。

【问题讨论】:

  • 每当您尝试使用终端连接时,请指定认证数据库以顺利连接。 mongo -u "gambit_admin" -p "pwd" YOURHOSTIP --authenticationDatabase "gambit_test"
  • 参考我的第一条评论添加信息:如果您连接到本地主机,您可以跳过YOURHOSTIP

标签: python mongodb pymongo mongoengine


【解决方案1】:

为了进一步参考,问题已得到修复 (https://github.com/MongoEngine/mongoengine/issues/2010) 问题是第二个connect 调用没有覆盖第一个调用设置的default 连接,它只是被默默地忽略了

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 2020-11-26
    • 2021-04-10
    • 2019-09-02
    • 2019-03-25
    • 2019-12-17
    • 2021-11-22
    • 1970-01-01
    • 2020-08-15
    相关资源
    最近更新 更多