mongodb - 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”,但证明身份验证成功。
我的猜测是从命令行自动设置了一个未从脚本版本设置的必需值,或者命令行版本以某种方式绕过了脚本版本被捕获的额外级别的身份验证。
在这一点上,不幸的是我没有东西可以尝试,而且我已经用尽了谷歌的帮助。任何指导将不胜感激!
解决方案
推荐阅读
- django - 只想验证超级用户
- angularjs - 在不使用父索引的情况下创建新的 angularjs 路由(IStateProvider)
- powershell - 新邮箱脚本,将邮政编码和邮政信箱值添加到邮箱用户帐户。可能的?
- socrata - 将 Google Charts API 导入 data.medicare.gov
- ios - 如何将数组附加到当前索引处的数组?
- php - 将我的 Laravel 连接到外部数据库
- arrays - Laravel 集合:在 groupBy() 之后删除集合分组
- react-native-android - 无法加载 fontFamily:FontAwesome in reactnative
- vscode-settings - 如何在 vscode explorer 中增加缩进宽度
- python - Django Celery & Django-Celery-Beat