Не удается пройти проверку подлинности и вставить в базу данных mon go. pymon go - python - PullRequest
1 голос
/ 01 февраля 2020

Файл docker compose yml имеет настройки контейнера mon go, как показано ниже:

         mongo:
            image: mongo
            restart: always
            ports:
              - 27017:27017
            environment:
              MONGO_INITDB_ROOT_USERNAME: "minu"
              MONGO_INITDB_ROOT_PASSWORD: "strongPq23$"

У меня есть код python, который выглядит следующим образом:

        import pymongo
        import sys

        class mongo_client:

            def __init__(self,host,port,db,username,password):
                self.client =pymongo.MongoClient(host=host,port=port,username=username,password=password,authSource=db)
                self.mydb = self.client[db]


            def insert_one(self,json,collection):
                try:
                    inserted=(self.mydb[collection]).insert_one(json)
                except:
                    print("Unexpected error while inserting into Mongo DB:", sys.exc_info()[0])
                    return
                return inserted.inserted_id

        m=mongo_client(host='127.0.0.1',port=27017,db=0,username='minu',password="strongPq23$",authSource=0
        m.insert_one(some_dict,collection)      

Я не уверен, что метод аутентификации, который я использую, правильный? Я получаю ошибку аутентификации. Я просто хочу вставить документы, используя insert_one (), который работает иначе, если нет контейнера и нет пользователя

1 Ответ

0 голосов
/ 01 февраля 2020

Вы должны создать отдельного пользователя для пользователя root для использования в вашем коде pymon go. Для этого вам понадобится доступ к инструменту командной строки mon go. Предполагая, что клиент linux можно запустить:

SERVER=localhost
PORT=27017
ROOT_USERNAME=root
ROOT_PASSWORD=very_strong_root_password
ADMIN_USERNAME=minu
ADMIN_PASSWORD=strongPq23$

docker run -d -p ${PORT}:27017 --name mongo -e MONGO_INITDB_ROOT_USERNAME=${ROOT_USERNAME} -e MONGO_INITDB_ROOT_PASSWORD=${ROOT_PASSWORD} --restart always mongo
mongo mongodb://${ROOT_USERNAME}:${ROOT_PASSWORD}@${SERVER}:${PORT}/admin?authSource=admin --eval "db.createUser({user: '${ADMIN_USERNAME}', pwd: '${ADMIN_PASSWORD}', roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]});"
mongo mongodb://${ROOT_USERNAME}:${ROOT_PASSWORD}@${SERVER}:${PORT}/admin?authSource=admin --eval "db.updateUser('${ADMIN_USERNAME}', {roles: [{role: 'root', db: 'admin'}]});"

Затем при запуске python это тест:

import pymongo
import sys

class MyMongoClient:

    def __init__(self,connection_string):
        self.client =pymongo.MongoClient(connection_string)
        self.mydb = self.client.db


    def insert_one(self, json, collection):
        try:
            inserted = self.mydb[collection].insert_one(json)
        except:
            print("Unexpected error while inserting into Mongo DB:", sys.exc_info()[0:2])
            return
        return inserted.inserted_id


m = MyMongoClient(connection_string='mongodb://minu:strongPq23$@localhost:27017/your_database?authSource=admin')
print(m.insert_one({'a': 1}, 'test_collection'))

Обратите внимание, что это дает ADMIN_USERNAME очень широкие разрешения, поэтому вы можете адаптировать их по мере необходимости. Кроме того, как только у вас это работает. смонтируйте том на вашем docker контейнере, иначе все данные будут равны sh при каждом перезапуске.

...