Python 使用docker进行PyMongo身份验证

Python 使用docker进行PyMongo身份验证,python,mongodb,authentication,pymongo,Python,Mongodb,Authentication,Pymongo,我在验证MongoDB中新创建的用户时遇到一些问题。我的设置是容器中的MongoDB 4.4.2和python 3.8 我创建了一个用户,如下所示: from pymongo import MongoClient host = "mongodb://root_user:root_password@172.20.0.3:27017" DB_NAME = "test" client = MongoClient(host) test_db = client[D

我在验证MongoDB中新创建的用户时遇到一些问题。我的设置是容器中的MongoDB 4.4.2和python 3.8

我创建了一个用户,如下所示:

from pymongo import MongoClient

host = "mongodb://root_user:root_password@172.20.0.3:27017"
DB_NAME = "test"
client = MongoClient(host)
test_db = client[DB_NAME]
test_db.command("createUser", "TestUser", pwd="TestPwd", roles=["readWrite"])
到目前为止,一切都很好:我只是简单地将
TestUser
添加到数据库
test
,因此当我查询集合
client.system.users.find({'user':'TestUser'})
,我会用
db:test
获得测试用户

现在,如果我想用

host = "mongodb://TestUser:testPwd@172.20.0.3:27017"
它显示身份验证失败:
pymongo.errors.OperationFailure:身份验证失败。

我可以通过容器内的shell进行连接,但不能通过pymongo进行连接,并且我已经尝试通过指定身份验证方法和身份验证数据库进行连接,但到目前为止,这两种方法都不起作用

任何提示都将不胜感激

两个问题

  • 正如评论者所指出的,您正在
    test
    数据库中创建用户;默认情况下,如果未指定
    authSource
    ,MongoDB将在
    admin
    数据库中查找凭据。因此,您需要将
    /?authSource=test
    附加到连接字符串中

  • 您使用密码
    TestPwd
    创建帐户,但在连接字符串上有
    TestPwd
    ;所以这不会进行身份验证

  • 因此,假设您的密码肯定是
    TestPwd
    ,那么您的连接字符串应该是:

    mongodb://TestUser:TestPwd@172.20.0.3:27017/test?authSource=test
    
    两个问题

  • 正如评论者所指出的,您正在
    test
    数据库中创建用户;默认情况下,如果未指定
    authSource
    ,MongoDB将在
    admin
    数据库中查找凭据。因此,您需要将
    /?authSource=test
    附加到连接字符串中

  • 您使用密码
    TestPwd
    创建帐户,但在连接字符串上有
    TestPwd
    ;所以这不会进行身份验证

  • 因此,假设您的密码肯定是
    TestPwd
    ,那么您的连接字符串应该是:

    mongodb://TestUser:TestPwd@172.20.0.3:27017/test?authSource=test
    

    目前还不清楚您正在对哪个数据库进行身份验证。您可以使用
    authSource=test
    设置authenticationDatabase。这会将您的URI带到
    mongodb://TestUser:testPwd@172.20.0.3:27017/?authSource=测试
    。根据文档:哦,伙计,在我的实验中,我一直在设置
    authSource=system
    ,因为它在
    system.users
    中,这个条目存在,但我完全忽略了
    authSource
    是我试图连接到的数据库这一点。非常感谢@RobertSeamanIt不清楚您要对哪个数据库进行身份验证。您可以使用
    authSource=test
    设置authenticationDatabase。这会将您的URI带到
    mongodb://TestUser:testPwd@172.20.0.3:27017/?authSource=测试
    。根据文档:哦,伙计,在我的实验中,我一直在设置
    authSource=system
    ,因为它在
    system.users
    中,这个条目存在,但我完全忽略了
    authSource
    是我试图连接到的数据库这一点。非常感谢@robertseamanidect,我重新编写了另一个连接字符串,而不是复制粘贴它。我的错!在你的回答中,tho,我想你指的是端口27017,不是27019。哦,是的,对不起,27017-编辑了它。很高兴你让它工作。事实上,我重新编写了另一个连接字符串,而不是复制粘贴它。我的错!在你的回答中,tho,我想你指的是端口27017,不是27019。哦,是的,对不起,27017-编辑了它。很高兴你让它工作了。