sql >> Database teknologi >  >> NoSQL >> MongoDB

Godkend efter at have valgt databasen

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:

  1. Hvis intet andet databasenavneområde er forsynet med forbindelsesdetaljer for godkendelsesoplysninger, så "admin" anses for at være standard .

  2. 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.

  3. 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.




  1. nodejs mongodb objekt-id til streng

  2. Adgang til MongoDB fra Go

  3. Hvordan matcher man hele dokumentet?

  4. Oprettelse af korte, unikke objekt-id'er i MongoDB