Для данного пользователя foo
с паролем bar
я могу успешно пройти аутентификацию на базе данных admin
и получить желаемый результат на одном из наших узлов сегментов с помощью следующей команды:
mongo PRIMARY --host exampleShard1.com \
--port 27018 \
--username foo \
-p bar \
--authenticationDatabase 'admin' \
--eval 'db.serverStatus().connections'
Однако при попытке выполнить точно такую же команду через стороннюю библиотеку, такую как драйвер Java или 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", подтверждая успешную аутентификацию.
Я думаю, что естьтребуемое значение устанавливается автоматически из командной строки, а не из версии сценария или что команда lВ любом случае версия каким-то образом обходит дополнительный уровень аутентификации, в который попадает версия скрипта.
На данный момент я, к сожалению, не могу попробовать, и я исчерпал Google за помощь.Любое руководство будет с благодарностью!