无法进行身份验证并插入到mongo DB 中. pymongo-python



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(( 插入文档,如果没有容器和用户,否则可以工作

你应该为根用户创建一个单独的用户,以便在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 容器上挂载卷,否则所有数据将在每次重新启动时消失。

最新更新