Du ser ud til at mangle nogle begreber her, så jeg vil som udgangspunkt svare som en "guide" til, hvad du bør gøre i stedet for. Så "godkendelse" er egentlig ikke noget, du gør "efter" forbindelse, men snarere skal du "se det rigtige sted", når du rent faktisk forsøger at godkende.
Vi kan starte dette ved i det væsentlige at følge den proces, der er beskrevet i Aktiver godkendelse fra kernedokumentationen, men specifikt ændret, fordi du ønsker at køre denne "test" under din egen brugerkonto og lokale mappe.
Revisionstrin – direkte fra dokumentation
Så ville først vælge en lokal arbejdsmappe og lave en sti til databaselagringsfilerne nedenunder. På *nix baserede systemer kan du gøre noget som:
mkdir -p scratch/data/db
cd scratch
Så vil vi starte en separat MongoDB-instans uden andre muligheder. Sørg for, at porten ikke er i konflikt med nogen anden kørende instans:
mongod --port 37017 --dbpath data/db
I et nyt terminal- eller kommandolinjevindue kan du derefter oprette forbindelse til skallen:
mongo --port 37017
Du vil altid have mindst én konto med administrative rettigheder til som minimum at "oprette konti" og ændre dem, hvis du får problemer, så opret en:
use admin
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
}
)
Afslut nu skallen og luk den eksisterende mongod
instans, der kører i den anden terminal eller kommandoprompt, og start den derefter igen med --auth
:
mongod --auth --port 37017 --dbpath data/db
Specifikke bruger - Sørg for at følge disse
Nu vil du faktisk oprette en bruger, der skal "bruges af din applikation". Så disse trin er vigtige for at sikre, at du får det rigtigt.
Log ind på en shell ved hjælp af din "administrative bruger":
mongo -u admin -p admin --port 37017 --authenticationDatabase 'admin'
Du kan alternativt gøre db.auth()
metode som vist i spørgsmålet, men som nævnt skal være autoriseret på "admin"
navneområde.
Den næste ting du vil gøre er at oprette en bruger med adgang til "mydb"
som et navneområde med readWrite
rolle. For kick, vil vi også lade denne bruger have readAnyDatabase
giver dem mulighed for at "liste" alle databasers navneområder, hvis de ikke faktisk er i stand til at gøre noget andet med dem.
use admin
db.createUser(
{
"user": "myuser",
"pwd": "password",
"roles": [
{ "role": "readWrite", "db": "mydb" },
"readAnyDatabase"
]
}
)
Bare for yderligere output, lad os se på de nuværende oprettede brugere:
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"
}
]
}
]
Se, hvordan disse er blevet udvidet i navngivning, og især de værdier, der er tildelt de forskellige "db"
nøgler på hver bruger. Dette burde give dig lidt mere indsigt i, hvordan MongoDB slår dette op og hvorfor.
Python-forbindelse
Til sidst vil vi bare oprette forbindelse fra python. Så hvis du antager, at du allerede har python og pymongo installeret, så er det bare en simpel liste at bekræfte:
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)
Hvilket viser dokumentet oprettet og listet uden problemer:
{u'a': 1, u'_id': ObjectId('5a08e5e0760108251722a737')}
Bemærk, at vi faktisk ikke behøver at nævne "admin"
her, fordi dette er standarden, hvor føreren "forventer, at konti er", og hvor du virkelig "burde" gøre det.
Men jeg gjorde det på den forkerte måde
Så lad os sige, at du oprindeligt blev forvirret og oprettede brugeren under "mydb"
i stedet:
use mydb
db.createUser({ "user": "bert", "pwd": "password", "roles": ["readWrite"] })
Hvis du går, kigger du i "admin"
den bruger er der ikke. Men hvis du ser på "mydb"
:
use mydb
db.getUsers()
[
{
"_id" : "mydb.bert",
"user" : "bert",
"db" : "mydb",
"roles" : [
{
"role" : "readWrite",
"db" : "mydb"
}
]
}
]
Så du kan se, hvor de faktiske brugerdata nu opbevares, og hvordan de er blevet registreret.
Det enkle tilfælde her er, at du "skal" fortælle MongoDB, hvor du kan hente godkendelsen fra denne bruger:
client = MongoClient('mongodb://bert:[email protected]:37017/mydb');
Se, hvordan vi tilføjer "mydb"
videre til forbindelsesstrengen. Sådan gøres det.
Dette er faktisk "i gang" for at blive gjort i overensstemmelse med ALLE drivere i, hvordan forbindelser laves, og hvor autentificering sker, samt hvor du vælger databasen. Men der er grundlæggende regler:
-
Hvis intet andet databasenavneområde er forsynet med forbindelsesdetaljer for godkendelsesoplysninger, så
"admin"
anses for at være standard . -
Hvor der er angivet et databasenavneområde på forbindelsesstrengen, vil dette blive brugt til godkendelse og dette er den faktiske hensigt med databasenavnerummet på forbindelsesstrengen.
-
Selvom andre drivere "på nuværende tidspunkt" adskiller sig i rollen som databasenavnerummet på forbindelsesstrengen, ændres brugen, så den stemmer overens med alle drivere, at "brug af" et databasenavneområde i virkeligheden er et API-kald i stedet for at blive tildelt fra forbindelsesstreng.
Så hvor du skal autentificere afhænger af "hvor du oprettede brugeren". Men du bør virkelig bemærke, at "admin"
er stedet, hvor du "burde" gøre dette i stedet for andre steder.