Vous semblez manquer certains concepts ici, donc je vais essentiellement répondre comme un "guide" sur ce que vous devriez faire à la place. Donc, "l'authentification" n'est pas vraiment quelque chose que vous faites "après" la connexion, mais vous devez plutôt "rechercher au bon endroit" lorsque vous essayez réellement de vous authentifier.
Nous pouvons commencer cela en suivant essentiellement le processus décrit dans Activer l'authentification de la documentation de base, mais spécifiquement modifié parce que vous souhaitez exécuter ce "test" sous votre propre compte d'utilisateur et répertoire local.
Étapes de révision - Directement à partir de la documentation
Il faudrait donc d'abord choisir un répertoire de travail local et créer un chemin pour les fichiers de stockage de la base de données en dessous. Sur les systèmes basés sur *nix, vous pouvez faire quelque chose comme :
mkdir -p scratch/data/db
cd scratch
Ensuite, nous voulons démarrer une instance MongoDB distincte sans aucune autre option. Assurez-vous que le port n'entre pas en conflit avec une autre instance en cours d'exécution :
mongod --port 37017 --dbpath data/db
Dans une nouvelle fenêtre de terminal ou de ligne de commande, vous pouvez ensuite vous connecter au shell :
mongo --port 37017
Vous voulez toujours au moins un compte avec des privilèges administratifs pour au moins "créer des comptes" et les modifier en cas de problème, alors créez-en un :
use admin
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
}
)
Maintenant, quittez le shell et fermez le mongod
existant instance en cours d'exécution dans l'autre terminal ou invite de commande, puis redémarrez-la en utilisant --auth
:
mongod --auth --port 37017 --dbpath data/db
Utilisateur spécifique :assurez-vous de suivre ces instructions
Maintenant, vous voulez réellement créer un utilisateur qui sera "utilisé par votre application". Ces étapes sont donc importantes pour vous assurer de bien faire les choses.
Connectez-vous à un shell en utilisant votre "utilisateur administrateur":
mongo -u admin -p admin --port 37017 --authenticationDatabase 'admin'
Vous pouvez alternativement faire le db.auth()
méthode comme indiqué dans la question, mais comme indiqué, cela doit être autorisé sur le "admin"
espace de noms.
La prochaine chose que vous voulez faire est de créer un utilisateur ayant accès à "mydb"
comme espace de noms avec le readWrite
rôle. Pour les coups de pied, nous allons également laisser cet utilisateur avoir le readAnyDatabase
leur permettant de "répertorier" tous les espaces de noms de bases de données, s'ils ne peuvent en fait rien faire d'autre avec eux.
use admin
db.createUser(
{
"user": "myuser",
"pwd": "password",
"roles": [
{ "role": "readWrite", "db": "mydb" },
"readAnyDatabase"
]
}
)
Juste pour une sortie supplémentaire, regardons les utilisateurs actuellement créés :
db.getUsers()
[
{
"_id" : "admin.admin",
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
},
{
"_id" : "admin.myuser",
"user" : "myuser",
"db" : "admin",
"roles" : [
{
"role" : "readWrite",
"db" : "mydb"
},
{
"role" : "readAnyDatabase",
"db" : "admin"
}
]
}
]
Voyez comment ceux-ci se sont développés dans la dénomination, et en particulier les valeurs attribuées aux différents "db"
touches sur chaque utilisateur. Cela devrait vous donner un peu plus d'informations sur la façon dont MongoDB recherche cela et pourquoi.
Connexion Python
Enfin, nous voulons simplement nous connecter à partir de python. Donc, en supposant que vous ayez déjà installé python et pymongo, il ne s'agit que d'une simple liste à vérifier :
import pymongo
from pymongo import MongoClient
client = MongoClient('mongodb://myuser:[email protected]:37017');
db = client['mydb']
col = db.test
col.remove()
col.insert_one({ "a": 1 })
for doc in col.find():
print(doc)
Ce qui montre le document créé et listé sans problème :
{u'a': 1, u'_id': ObjectId('5a08e5e0760108251722a737')}
Notez que nous n'avons pas vraiment besoin de mentionner "admin"
ici, car c'est l'endroit par défaut où le conducteur "attend que les comptes soient" et où vous "devriez" vraiment le faire.
Mais je l'ai mal fait
Supposons donc que vous ayez été confus à l'origine et que vous ayez créé l'utilisateur sous "mydb"
à la place :
use mydb
db.createUser({ "user": "bert", "pwd": "password", "roles": ["readWrite"] })
Si vous allez regarder dans "admin"
cet utilisateur n'est pas là. Mais si vous regardez "mydb"
:
use mydb
db.getUsers()
[
{
"_id" : "mydb.bert",
"user" : "bert",
"db" : "mydb",
"roles" : [
{
"role" : "readWrite",
"db" : "mydb"
}
]
}
]
Ainsi, vous pouvez voir où les données utilisateur réelles sont désormais conservées et comment elles ont été enregistrées.
Le cas simple ici est que vous "devez" indiquer à MongoDB où obtenir l'authentification pour cet utilisateur :
client = MongoClient('mongodb://bert:[email protected]:37017/mydb');
Voyez comment nous ajoutons "mydb"
sur la chaîne de connexion. C'est comme ça que ça marche.
Ceci est en fait "en cours" pour être cohérent avec TOUS les pilotes dans la façon dont les connexions sont établies et où l'authentification se produit ainsi que l'endroit où vous sélectionnez la base de données. Mais il y a des règles de base :
-
Si aucun autre espace de noms de base de données n'est fourni avec les détails de connexion pour les identifiants d'authentification, alors
"admin"
est considéré comme la valeur par défaut . -
Lorsqu'un espace de noms de base de données est fourni sur la chaîne de connexion, il sera utilisé pour l'authentification et c'est l'intention réelle de l'espace de noms de base de données sur la chaîne de connexion.
-
Bien que d'autres pilotes diffèrent "actuellement" dans le rôle de l'espace de noms de base de données sur la chaîne de connexion, l'utilisation est modifiée pour être cohérente avec tous les pilotes selon lesquels "l'utilisation" d'un espace de noms de base de données est en fait un appel d'API, plutôt que d'être attribué à partir du chaîne de connexion.
Ainsi, l'endroit où vous devez vous authentifier dépend de "l'endroit où vous avez créé l'utilisateur". Mais vous devriez vraiment noter que "admin"
est l'endroit où vous "devriez" faire cela plutôt qu'ailleurs.