Mongoengine - команда find требует аутентификации - PullRequest
0 голосов
/ 27 февраля 2019

Я новичок в использовании Mongoengine с аутентифицированной MongoDB.

У меня есть база данных Mongo под названием 'gambit_test'.Я включил аутентификацию на нем, и у меня есть подходящий пользователь, который может аутентифицироваться в базе данных для выполнения чтения и записи.

Я создал пользователя для gambit_test, используя следующую команду в Mongo Client:

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

Понятия не имею, почему это происходит.Причина в том, что я могу выполнить обычные функции find () и insert () с помощью клиента Mongo.Но, когда я использую Mongoengine, вещи ломаются ...

Любая помощь будет очень цениться.

1 Ответ

0 голосов
/ 14 мая 2019

Для дальнейшего использования проблема была исправлена ​​(https://github.com/MongoEngine/mongoengine/issues/2010) Проблема заключалась в том, что второй вызов connect не переписывал соединение default, установленное первым вызовом, он просто игнорировался

...