Не удается аутентифицироваться в манго, "auth failed"
Я создал пользователя-администратора для Монго, используя следующие инструкции:
http://docs.mongodb.org/manual/tutorial/add-user-administrator/
С клиента Монго, похоже, я могу аутентифицироваться:
> use admin
switched to db admin
> db.auth('admin','SECRETPASSWORD');
1
>
Но я не могу подключиться другим способом. Например:
mongo -u admin -p SECRETPASSWORD
выдает ошибку:
JavaScript execution failed: Error: 18 { code: 18, ok: 0.0, errmsg: "auth fails" } at src/mongo/shell/db.js:L228
У меня есть auth = true
в etc/mongod.conf
.
Чего мне не хватает?
Ответы
Ответ 1
Аутентификация управляется на уровне базы данных. Когда вы пытаетесь подключиться к системе, используя базу данных, mongo фактически проверяет учетные данные, которые вы предоставляете в коллекции <database>.system.users
. Итак, в основном, когда вы пытаетесь подключиться к "test", он ищет учетные данные в test.system.users
и возвращает ошибку, потому что не может их найти (так как они хранятся в admin.system.users
). Наличие права на чтение и запись со всех БД не означает, что вы можете напрямую подключиться к ним.
Сначала необходимо подключиться к базе данных, содержащей учетные данные. Пытаться:
mongo admin -u admin -p SECRETPASSWORD
Для получения дополнительной информации, проверьте это http://docs.mongodb.org/manual/reference/privilege-documents/
Ответ 2
Я также получил эту ошибку, мне нужно было указать базу данных, в которой хранились данные аутентификации пользователя:
mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin
Обновление 18 ноября 2017 г.:
mongo admin -u admin -p
- лучшее решение. Mongo запросит у вас пароль, таким образом, вы не будете вводить пароль в виде открытого текста в историю оболочки, что является просто ужасной практикой безопасности.
Ответ 3
Вам может потребоваться обновить оболочку mongo. У меня была версия 2.4.9 оболочки mongo локально, и я получил эту ошибку, пытающуюся подключиться к базе mongo 3. Обновление версии оболочки до 3 позволило решить проблему.
Ответ 4
Я знаю, это может показаться очевидным, но мне также пришлось использовать одну кавычку вокруг u/n и p/w, прежде чем это сработало
администратор монго -u "пользователь" -p "пароль"
Ответ 5
В MongoDB 3.0 теперь он поддерживает несколько механизмов аутентификации.
- Задача и ответ MongoDB (SCRAM-SHA-1) - по умолчанию в версии 3.0
- MongoDB Challenge и Response (MONGODB-CR) - предыдущий по умолчанию (< 3.0)
Если вы начали с новой базы данных 3.0 с новыми пользователями, они были бы созданы с использованием SCRAM-SHA-1.
Для этого вам понадобится драйвер, способный к такой аутентификации:
http://docs.mongodb.org/manual/release-notes/3.0-scram/#considerations-scram-sha-1-drivers
Если у вас была обновленная база данных 2.x с существующими пользовательскими данными, они все равно будут использовать MONGODB-CR, и база данных аутентификации пользователей должна быть обновлена:
http://docs.mongodb.org/manual/release-notes/3.0-scram/#upgrade-mongodb-cr-to-scram
Теперь подключение к MongoDB 3.0 с пользователями, созданными с помощью SCRAM-SHA-1, необходимо указать базу данных аутентификации (через клиент командной строки mongo) и использовать другие механизмы при использовании драйвера.
$ > mongo -u USER -p PASSWORD --authenticationDatabase admin
В этом случае для аутентификации будет использоваться база данных "admin", которая также является по умолчанию.
Ответ 6
Похоже, что проблема заключается в том, что пользователь, созданный с помощью метода, описанного в документах mongo, не имеет разрешения на подключение к базе данных по умолчанию (тест), даже если этот пользователь был создан с ролями "userAdminAnyDatabase" и "dbAdminAnyDatabase".
Ответ 7
Это устранило мою проблему:
Перейдите в оболочку терминала и введите mongo
.
Затем введите use db_name
.
Затем введите:
db.createUser(
{
user: "mongodb",
pwd: "dogmeatsubparflavour1337",
roles: [ { role: "dbOwner", db: "db_name" } ]
}
)
Также попробуйте: db.getUsers()
Быстрый пример:
const MongoClient = require('mongodb').MongoClient;
// MongoDB Connection Info
const url = 'mongodb://mongodb:[email protected]:27017/?authMechanism=DEFAULT&authSource=db_name';
// Additional options: https://docs.mongodb.com/manual/reference/connection-string/#connection-string-options
// Use Connect Method to connect to the Server
MongoClient.connect(url)
.then((db) => {
console.log(db);
console.log('Casually connected correctly to server.');
// Be careful with db.close() when working asynchronously
db.close();
})
.catch((error) => {
console.log(error);
});
Ответ 8
Это своего рода конкретный случай, но если кто-нибудь попадет сюда с моей проблемой:
В MongoHQ он покажет вам поле под названием "пароль", но на самом деле это всего лишь хэш пароля. Вам нужно будет добавить нового пользователя и сохранить пароль в другом месте (потому что MongoHQ не покажет его вам).
Ответ 9
Правильный способ входа в оболочку mongo -
mongo localhost: 27017 -u 'uuuuu' -p ' > xxxxxx' --authenticationDatabase dbname
Ответ 10
Другая возможность: когда вы создали пользователя, вы могли случайно use
базу данных, отличную от admin
, или ту, которую вы хотели. Вам необходимо установить --authenticationDatabase
для базы данных, в которой пользователь был фактически создан.
mongodb
видимому, помещает вас в test
базу данных по умолчанию при открытии оболочки, поэтому вам нужно будет написать --authenticationDatabase test
--authenticationDatabase admin
если вы случайно use
test
при db.createUser(...)
Предполагая, что у вас есть доступ к компьютеру, на котором запущен экземпляр mongodb, y может отключить авторизацию в /etc/mongod.conf
(закомментировать authorization
которая вложена под защитой), а затем перезапустить сервер и запустить:
mongo
show users
И вы можете получить что-то вроде этого:
{
"_id" : "test.myusername",
"user" : "myusername",
"db" : "test",
"roles" : [
{
"role" : "dbOwner",
"db" : "mydatabasename"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
Обратите внимание, что значение db
равно test
. Это потому, что когда я создавал пользователя, я сначала не запускал use admin
или use desiredDatabaseName
. Таким образом, вы можете удалить пользователя с помощью db.dropUser("myusername")
а затем создать другого пользователя в нужной базе данных, например:
use desiredDatabaseName
db.createUser(...)
Надеюсь, это поможет кому-то, кто был в моем положении новичка в этом деле.
Ответ 11
Вы также можете попробовать следующее: -
mongo localhost:27017/admin -u admin -p SECRETPASSWORD
Нашел его в этом сообщении
Здесь очевидно, что localhost может быть другим хостом, а /admin может быть другой базой данных, на которой была применена аутентификация
Ответ 12
Проверьте версию клиента mongo, с которой мы подключаемся к серверу mongo.
В моем случае сервер mongo был версии Mongo4.0.0, но мой клиент был версии 2.4.9. Обновите версию Монго, чтобы обновить Монго Cli.