Du verkar sakna några begrepp här så jag ska i princip svara som en "guide" till vad du borde göra istället. Så "autentisering" är egentligen inte något du gör "efter" anslutning, utan snarare måste du "söka på rätt ställe" när du faktiskt försöker autentisera.
Vi kan börja detta genom att i huvudsak följa processen som beskrivs i Aktivera autentisering från kärndokumentationen, men specifikt ändrad eftersom du vill köra detta "test" under ditt eget användarkonto och lokala katalog.
Revisionssteg – direkt från dokumentation
Så skulle först vilja välja en lokal arbetskatalog och skapa en sökväg för databaslagringsfilerna under den. På *nix-baserade system kan du göra något som:
mkdir -p scratch/data/db
cd scratch
Sedan vill vi starta en separat MongoDB-instans utan några andra alternativ. Se till att porten inte kommer i konflikt med någon annan körande instans:
mongod --port 37017 --dbpath data/db
I ett nytt terminal- eller kommandoradsfönster kan du sedan ansluta till skalet:
mongo --port 37017
Du vill alltid ha minst ett konto med administrativa rättigheter för att åtminstone "skapa konton" och ändra dem om du skulle råka ut för problem, så skapa ett:
use admin
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
}
)
Avsluta nu skalet och stäng den befintliga mongod
instans som körs i den andra terminalen eller kommandotolken och starta den sedan igen med --auth
:
mongod --auth --port 37017 --dbpath data/db
Specifik användare – Se till att du följer dessa
Nu vill du faktiskt skapa en användare som ska "användas av din applikation". Så dessa steg är viktiga för att säkerställa att du gör rätt.
Logga in på ett skal med din "administrativa användare":
mongo -u admin -p admin --port 37017 --authenticationDatabase 'admin'
Du kan alternativt göra db.auth()
metod som visas i frågan, men som nämnts måste vara auktoriserad på "admin"
namnutrymme.
Nästa sak du vill göra är att skapa en användare med tillgång till "mydb"
som ett namnområde med readWrite
roll. För kicks kommer vi också att låta den här användaren ha readAnyDatabase
tillåta dem att "lista" alla databasers namnrymder, om de inte faktiskt kan göra något annat med dem.
use admin
db.createUser(
{
"user": "myuser",
"pwd": "password",
"roles": [
{ "role": "readWrite", "db": "mydb" },
"readAnyDatabase"
]
}
)
Bara för ytterligare utdata, låt oss titta på de nuvarande skapade användarna:
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 hur dessa har utökats i namngivning, och särskilt värdena som tilldelats de olika "db"
nycklar på varje användare. Detta borde ge dig lite mer insikt i hur MongoDB ser upp detta och varför.
Python-anslutning
Slutligen vill vi bara ansluta från python. Så om du antar att du redan har python och pymongo installerade, så är det bara en enkel lista att verifiera:
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)
Vilket visar dokumentet skapat och listat utan problem:
{u'a': 1, u'_id': ObjectId('5a08e5e0760108251722a737')}
Observera att vi faktiskt inte behöver nämna "admin"
här, eftersom detta är standard där föraren "förväntar sig att kontona ska vara" och där du verkligen "bör" göra det.
Men jag gjorde det på fel sätt
Så låt oss säga att du ursprungligen blev förvirrad och skapade användaren under "mydb"
istället:
use mydb
db.createUser({ "user": "bert", "pwd": "password", "roles": ["readWrite"] })
Om du går titta i "admin"
den användaren är inte där. Men om du tittar på "mydb"
:
use mydb
db.getUsers()
[
{
"_id" : "mydb.bert",
"user" : "bert",
"db" : "mydb",
"roles" : [
{
"role" : "readWrite",
"db" : "mydb"
}
]
}
]
Så du kan se var den faktiska användardatan nu förvaras och hur den har registrerats.
Det enkla fallet här är att du "måste" tala om för MongoDB var du ska hämta autentiseringen för den här användaren:
client = MongoClient('mongodb://bert:[email protected]:37017/mydb');
Se hur vi lägger till "mydb"
vidare till anslutningssträngen. Så här görs det.
Detta är faktiskt "på gång" för att göras överensstämmande med ALLA drivrutiner i hur anslutningar görs och var autentisering sker samt var du väljer databasen. Men det finns grundläggande regler:
-
Om inget annat databasnamnområde tillhandahålls med anslutningsdetaljer för autentiseringsuppgifter, då
"admin"
anses vara standard . -
Om det finns ett databasnamnområde på anslutningssträngen, kommer det att användas för autentisering och detta är den faktiska avsikten med databasens namnutrymme på anslutningssträngen.
-
Även om andra drivrutiner "för närvarande" skiljer sig åt i rollen för databasnamnutrymmet på anslutningssträngen, ändras användningen för att överensstämma med alla drivrutiner att "att använda" ett databasnamnområde i själva verket är ett API-anrop, snarare än att tilldelas från anslutningssträng.
Så var du behöver autentisera beror på "var du skapade användaren". Men du bör verkligen notera att "admin"
är platsen där du "borde" göra detta istället för någon annanstans.