【问题标题】:Not able to authenticate and insert into the mongo DB . pymongo- python无法验证并插入 mongo DB。 pymongo-蟒蛇
【发布时间】:2020-02-01 07:24:43
【问题描述】:

docker compose yml 文件的 mongo 容器设置如下:

         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() 插入文档,如果没有容器也没有用户,否则它会起作用

【问题讨论】:

    标签: python-3.x mongodb docker-compose pymongo


    【解决方案1】:

    您应该为 root 用户创建一个单独的用户,以便在您的 pymongo 代码中使用。您需要访问 mongo 命令行工具才能执行此操作。假设你可以运行一个 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 容器上挂载一个卷,否则每次重启时所有数据都会消失。

    【讨论】:

    • 我已经在 docker_compose 中有 ROOT_USER。为什么我需要 ADMIN_USER。我的问题是容器化时创建的 root 用户,如何在代码中创建 py mongo 客户端时进行身份验证。使用相同的 docker-compose 我尝试了 m = MyMongoClient(connection_string='mongodb://minu:strongPq23$@localhost:27017/your_database?authSource=admin') 。但这不起作用。在 insert_one() 时它超时
    • 我所概述的是设置 MongoDB 与 pymongo 一起使用所需的身份验证的正确方法。如果您想继续尝试并使用错误的方法并在它不起作用时继续感到惊讶,那么这取决于您。
    猜你喜欢
    • 2012-03-25
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多