[当尝试使用以下命令直接从Shell连接到Mongo
时:
mongo admin -u superadmin -p super_password
一切都很好,但是将相同的凭据与flask_mongoengine
一起使用会引发以下错误:
pymongo.errors.OperationFailure: Authentication failed.
我的config.py
:
MONGODB_DB = os.getenv('DATABASE_NAME', 'db')
MONGODB_HOST = os.getenv('DATABASE_HOST', 'localhost')
MONGODB_PORT = int(os.getenv('DATABASE_PORT', 27017))
MONGODB_USERNAME = os.getenv('DATABASE_USER')
MONGODB_PASSWORD = os.getenv('DATABASE_PASS')
我的.env
文件:
DATABASE_NAME=mydb
DATABASE_HOST=myhost
DATABASE_PORT=27017
DATABASE_USER=superadmin
DATABASE_PASS=super_password
我相信问题是您的用户未在mydb
中注册。
[当您使用mongo admin -u superadmin -p super_password
从mongo shell连接时,它将针对admin
数据库进行身份验证并打开该管理数据库。
[当您想连接到某个数据库(例如mydb
)时,要么需要在该特定数据库中拥有一个用户,要么需要明确指定您要通过另一个数据库进行身份验证(即,在admin
数据库中这种情况)通过指定authsource。
根据mongoengine doc中的指定,您可以使用URI样式进行连接:在普通的mongoengine中,这将是
from mongoengine import connect
connect(host="mongodb://username:password@host1:port1/database?authSource=source_database"
)
# in your case that would be
# host="mongodb://superadmin:super_password@myhost:27017/mydb?authSource=admin"
并且使用flask-mongoengine:
app.config['MONGODB_SETTINGS'] = {
'host': "mongodb://username:password@host1:port1/database?authSource=source_database"
}