Impossible de s'authentifier dans mongo, "échec de l'authentification"


90

J'ai créé un utilisateur administrateur pour mongo en utilisant ces instructions:

http://docs.mongodb.org/manual/tutorial/add-user-administrator/

Depuis le client mongo, il semble que je puisse m'authentifier:

> use admin
switched to db admin
> db.auth('admin','SECRETPASSWORD');
1
>

Mais je ne peux pas me connecter autrement. Par exemple:

mongo -u admin -p MOT DE PASSE SECRET

donne l'erreur:

JavaScript execution failed: Error: 18 { code: 18, ok: 0.0, errmsg: "auth fails" } at src/mongo/shell/db.js:L228

j'ai auth = true en etc/mongod.conf.

Qu'est-ce que je rate?


1
Peut-être que Mongo est configuré pour n'accepter que les connexions de l'hôte local? Cela m'est au moins arrivé en utilisant notre instance de production mongodb en essayant d'y accéder depuis mon ordinateur.
Akku

Je ne pense pas, je reçois ce message d'erreur lors de la connexion à partir de la même machine que mongod. De plus, cela me permet de me connecter sans fournir de nom d'utilisateur / mot de passe, puis de fournir un nom d'utilisateur / mot de passe avec db.auth (mon premier exemple).
justkevin

PS: db.changeUserPassword("admin", "password")pour changer le mot de passe de chaque base de données.
laggingreflex

Réponses:


100

L'authentification est gérée au niveau de la base de données. Lorsque vous essayez de vous connecter au système à l'aide d'une base de données, mongo vérifie en fait les informations d'identification que vous fournissez dans la collection <database>.system.users. Donc, fondamentalement, lorsque vous essayez de vous connecter à "test", il recherche les informations d'identification test.system.userset renvoie une erreur car il ne les trouve pas (car elles sont stockées dans admin.system.users). Avoir le droit de lire et d'écrire à partir de toutes les bases de données ne signifie pas que vous pouvez vous y connecter directement.

Vous devez d'abord vous connecter à la base de données contenant les informations d'identification. Essayer:

mongo admin -u admin -p SECRETPASSWORD

Pour plus d'informations, consultez ce http://docs.mongodb.org/manual/reference/privilege-documents/


4
comme cela est également mentionné ci-dessous, dans une autre réponse (mais je l'ai ratée, car je n'ai regardé que les meilleurs votés), je devais ajouter des guillemets simples autour du nom d'utilisateur et du mot de passe, avant de pouvoir
me

Oui, si vous utilisez des guillemets doubles, une bash idiote fera probablement toutes sortes de choses désagréables.
moodboom

73

J'ai également reçu cette erreur, ce dont j'avais besoin était de spécifier la base de données dans laquelle les données d'authentification de l'utilisateur étaient stockées:

mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin

Mise à jour du 18 novembre 2017:

mongo admin -u admin -p

est une meilleure solution. Mongo vous demandera votre mot de passe, de cette façon vous ne mettrez pas votre mot de passe en texte clair dans l'historique du shell, ce qui est simplement une pratique de sécurité terrible.


2
Oui, cette réponse fonctionne! En combinant cela avec la réponse de @gilo, la commande suivante fonctionne pour moi: "mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin"
Tsung-Ting Kuo

38

Vous devrez peut-être mettre à jour votre shell mongo. J'avais la version 2.4.9 du shell mongo localement, et j'ai eu cette erreur en essayant de me connecter à une base de données mongo 3. La mise à niveau de la version shell vers 3 a résolu le problème.


7
Comme indiqué dans le document: les versions du shell mongo antérieures à la version 3.0 ne sont pas compatibles avec les déploiements 3.0 de MongoDB qui appliquent le contrôle d'accès. Si vous disposez d'un déploiement MongoDB 3.0 qui nécessite un contrôle d'accès, vous devez utiliser les versions 3.0 du shell mongo.
Finch_Powers

32

Je sais que cela peut sembler évident, mais j'ai également dû utiliser un guillemet simple autour du u / n et du p / w avant que cela fonctionne

mongo admin -u 'utilisateur' -p 'mot de passe'


2
Je suis tombé sur votre réponse parce que cela mongo -u <myuser> -p <mypasswdne fonctionnait pas. Pourquoi ça adminfait une différence, ici?
blz

2
il dit à mongo d'utiliser la base de données admin. si vous créez une autre base de données et attribuez un utilisateur à cette base de données, alors ce sera mongo <another_database> -u user -p password
Afriyandi Setiawan

Merci beaucoup. C'est vraiment bizarre, je n'utilisais pas de guillemets ni guillemets doubles, cela ne fonctionnait pas. C'est tellement idiot.
rusty

20

Dans MongoDB 3.0, il prend désormais en charge plusieurs mécanismes d'authentification.

  1. Challenge et réponse MongoDB (SCRAM-SHA-1) - par défaut dans la version 3.0
  2. Challenge et réponse MongoDB (MONGODB-CR) - valeur par défaut précédente (<3.0)

Si vous avez commencé avec une nouvelle base de données 3.0 avec de nouveaux utilisateurs créés, ils auraient été créés à l'aide de SCRAM-SHA-1.

Vous aurez donc besoin d'un pilote capable de cette authentification:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#considerations-scram-sha-1-drivers

Si vous aviez une base de données mise à niveau à partir de 2.x avec des données utilisateur existantes, ils utiliseraient toujours MONGODB-CR, et la base de données d'authentification des utilisateurs devrait être mise à niveau:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#upgrade-mongodb-cr-to-scram

Désormais, la connexion à MongoDB 3.0 avec des utilisateurs créés avec SCRAM-SHA-1 est nécessaire pour spécifier la base de données d'authentification (via la ligne de commande mongo client), et en utilisant d'autres mécanismes si vous utilisez un pilote.

$> mongo -u USER -p MOT DE PASSE --authenticationDatabase admin

Dans ce cas, la base de données "admin", qui est également la base par défaut, sera utilisée pour s'authentifier.


Ce changement de comportement est important, car il m'a fait trébucher lors du mélange d'une nouvelle version de MongoDB et d'une ancienne version de pymongo. Vous devez vous assurer que votre instance mongo et tous les clients mongo sont à jour.
i_grok

C'était mon cas: 1. Changement de mongo-java-driver-2.12.3.jar en mongo-java-driver-3.2.2.jar 2. Changement de MongoCredential.createMongoCRCredential en MongoCredential.createCredential
nikolai.serdiuk

Pouah. à quel point serait-il difficile pour les développeurs de nous donner une meilleure erreur comme "méthode d'authentification invalide"
Byron Whitlock

13

Il semble que le problème soit qu'un utilisateur créé via la méthode décrite dans la documentation mongo n'a pas l'autorisation de se connecter à la base de données par défaut (test), même si cet utilisateur a été créé avec les rôles "userAdminAnyDatabase" et "dbAdminAnyDatabase".


ont le même problème. Leur pourrait être un moyen d'utiliser la base de données d'administration par défaut au lieu de test
Idan Shechter

13

Cela a résolu mon problème:

Accédez au shell du terminal et tapez mongo.

Puis tapez use db_name .

Tapez ensuite:

 db.createUser(
   {
     user: "mongodb",
     pwd: "dogmeatsubparflavour1337",
     roles: [ { role: "dbOwner", db: "db_name" } ]
   }
 )

Essayez aussi: db.getUsers()

Échantillon rapide:

const MongoClient = require('mongodb').MongoClient;

// MongoDB Connection Info
const url = 'mongodb://mongodb:dogmeatsubparflavour1337@stackoverflow.com: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);
  });

2
Pour ajouter: 1. Connectez-vous d'abord à la base de données admin avec mongodb superadmin: mongo 'mongodb://localhost:27017/admin' -u admin -p 2. Ensuite, passez à la base de données cible: > use targetDb 3. Ajoutez ensuite l'utilisateur> db.createUser(...)
daniel.widyanto

3

Autre possibilité: lors de la création de l'utilisateur, vous avez peut-être été accidentellement dans useune base de données autre que admincelle que vous vouliez, ou autre. Vous devez définir --authenticationDatabasela base de données sous laquelle l'utilisateur a été réellement créé.

mongodbsemble vous mettre dans la testbase de données par défaut lorsque vous ouvrez le shell, de sorte que vous aurez besoin d'écrire --authenticationDatabase testplutôt que --authenticationDatabase adminsi vous étiez accidentellement useING testlors de l' exécution db.createUser(...).

En supposant que vous ayez accès à la machine qui exécute l'instance mongodb, y pourrait désactiver l'autorisation d' /etc/mongod.confentrée (commentaire authorizationqui est imbriqué sous sécurité), puis redémarrer votre serveur, puis exécuter:

mongo
show users

Et vous pourriez obtenir quelque chose comme ceci:

{
    "_id" : "test.myusername",
    "user" : "myusername",
    "db" : "test",
    "roles" : [
        {
            "role" : "dbOwner",
            "db" : "mydatabasename"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}

Notez que la dbvaleur est égale à test. C'est parce que lorsque j'ai créé l'utilisateur, je n'ai pas exécuté use adminou use desiredDatabaseName. Ainsi, vous pouvez supprimer l'utilisateur avec db.dropUser("myusername"), puis créer un autre utilisateur sous la base de données souhaitée comme suit:

use desiredDatabaseName
db.createUser(...)

J'espère que cela aide quelqu'un qui était dans ma position de noob avec ce truc.


3

Contrairement à MYSQl et à la plupart des SGBDR, MongoDB a une configuration différente.

Il n'est pas livré avec un utilisateur d'authentification de base intégré déjà configuré.Vous devez le configurer manuellement. Vous devez aller sur Mongo.conf et activer l'autorisation, veuillez l'activer avec précaution, faute de quoi cela provoquera une erreur lors du démarrage de votre instance mongo. Vous vérifiez ensuite si votre serveur mongo a démarré ou non.

L'étape suivante consiste à activer l'autorisation dans Mongo en tant qu'utilisateur: -

Nous devons créer un utilisateur disposant d'un accès root et changer la configuration d'authentification mongo.

Basculer vers Admin DB: -

use admin

Créer un utilisateur avec le privilège racine: -

 db.createUser({user:"admin",
                     pwd:"admin",
                    roles:[{role:"root",
                             db:"admin"
                            }] });

Changez votre mongo.conf pour activer l'autorisation: -

security:
    authorization: "enabled"

Veuillez suivre ce guide étape par étape pour configurer l' authentification dans MongoDB.


2

C'est une sorte de cas spécifique, mais au cas où quelqu'un arriverait ici avec mon problème:

Dans MongoHQ, il vous montrera un champ appelé "mot de passe", mais ce n'est en fait que le hachage du mot de passe. Vous devrez ajouter un nouvel utilisateur et stocker le mot de passe ailleurs (car MongoHQ ne vous le montrera pas).


2

La bonne façon de se connecter à mongo shell est

mongo localhost: 27017 -u 'uuuuu' -p '> xxxxxx' --authenticationDatabase dbname


1

Vous pouvez également essayer ceci: -

mongo localhost:27017/admin -u admin -p SECRETPASSWORD

Je l'ai trouvé dans ce post

Ici, évidemment, l' hôte local peut être un autre hôte et le / admin peut être une autre base de données sur laquelle l'authentification a été appliquée


0

Vérifiez la version mongo du client à partir duquel nous nous connectons au serveur mongo.

Mon cas, le serveur mongo était de la version Mongo4.0.0 mais mon client était de la version 2.4.9. Mettez à jour la version mongo pour mettre à jour mongo cli.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.