首页 > 解决方案 > Mongo 身份验证通过命令行或解释器成功,通过库失败

问题描述

对于foo具有密码的给定用户bar,我可以成功地对admin数据库进行身份验证,并使用以下命令从我们的一个分片节点获得所需的结果:

mongo PRIMARY --host exampleShard1.com \
              --port 27018 \
              --username foo \
              -p bar \
              --authenticationDatabase 'admin' \
              --eval 'db.serverStatus().connections'

但是,当尝试通过第三方库(例如 Java 的MongoDB 驱动程序或 Python 的pymongo )执行完全相同的命令时,身份验证成功通过,但由于“未授权”错误,我无法成功执行任何命令。

例如,这是上述工作命令的 pymongo 版本:

#!/usr/bin/python3

from pymongo import MongoClient

mongoClient = MongoClient("exampleShard1.com", 27018)
mongoClient.admin.authenticate("foo", "bar")
primaryDb = mongoClient["PRIMARY"]
print(primaryDb.eval("db.serverStatus().connections"))

尽管这似乎等同于原始工作命令,但此版本失败并出现以下错误:

not authorized on local to execute command
{
    $eval: db.serverStatus().connections,
    args: [],
    lsid: { 
        id: UUID("f5a936ee-71ad-4568-8bf2-a45c69424200")
    },
    $clusterTime: {
        signature: {
            keyId: 111,
            hash: BinData(0, 6F)
        },
        clusterTime: Timestamp(1536848021, 159)
    },
    $db: "local",
    $readPreference: {
        mode: "primaryPreferred"
    }
}

尽管该authenticate()方法返回“True”,但证明身份验证成功。

我的猜测是从命令行自动设置了一个未从脚本版本设置的必需值,或者命令行版本以某种方式绕过了脚本版本被捕获的额外级别的身份验证。

在这一点上,不幸的是我没有东西可以尝试,而且我已经用尽了谷歌的帮助。任何指导将不胜感激!

标签: mongodbauthenticationpymongoreplicaset

解决方案


推荐阅读