MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Authentifizieren Sie sich nach der Auswahl der Datenbank

Ihnen scheinen hier einige Konzepte zu fehlen, daher antworte ich im Grunde als "Leitfaden", was Sie stattdessen tun sollten. "Authentifizierung" ist also nicht wirklich etwas, das Sie "nach" der Verbindung tun, sondern Sie müssen "an der richtigen Stelle suchen", wenn Sie tatsächlich versuchen, sich zu authentifizieren.

Wir können damit beginnen, indem wir im Wesentlichen dem in Enable Auth beschriebenen Prozess folgen aus der Kerndokumentation, aber speziell geändert, weil Sie diesen "Test" unter Ihrem eigenen Benutzerkonto und lokalen Verzeichnis ausführen möchten.

Überarbeitungsschritte - direkt aus der Dokumentation

Zuerst möchten Sie also ein lokales Arbeitsverzeichnis auswählen und darunter einen Pfad für die Datenbankspeicherdateien erstellen. Auf *nix-basierten Systemen können Sie Folgendes tun:

mkdir -p scratch/data/db
cd scratch

Dann wollen wir eine separate MongoDB-Instanz ohne weitere Optionen starten. Stellen Sie sicher, dass der Port nicht mit anderen laufenden Instanzen in Konflikt steht:

mongod --port 37017 --dbpath data/db

In einem neuen Terminal- oder Kommandozeilenfenster können Sie sich dann mit der Shell verbinden:

mongo --port 37017

Sie möchten immer mindestens ein Konto mit Administratorrechten, um zumindest "Konten zu erstellen" und sie zu ändern, falls Sie in Schwierigkeiten geraten, also erstellen Sie eines:

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

Verlassen Sie nun die Shell und schließen Sie den bestehenden mongod Instanz, die im anderen Terminal oder an der Eingabeaufforderung ausgeführt wird, und starten Sie sie dann erneut mit --auth :

mongod --auth --port 37017 --dbpath data/db

Spezieller Benutzer – Stellen Sie sicher, dass Sie diese befolgen

Jetzt möchten Sie tatsächlich einen Benutzer erstellen, der "von Ihrer Anwendung verwendet" wird. Daher sind diese Schritte wichtig, um sicherzustellen, dass Sie es richtig machen.

Melden Sie sich mit Ihrem "adminstrativen Benutzer" bei einer Shell an:

mongo -u admin -p admin --port 37017 --authenticationDatabase 'admin'

Alternativ können Sie db.auth() ausführen Methode wie in der Frage gezeigt, aber wie angemerkt muss auf dem "admin" autorisiert sein Namensraum.

Als nächstes möchten Sie einen Benutzer mit Zugriff auf "mydb" erstellen als Namensraum mit dem readWrite Rolle. Aus Spaß werden wir diesem Benutzer auch die readAnyDatabase überlassen ihnen erlaubt, alle Datenbank-Namespaces "aufzulisten", wenn sie eigentlich nichts anderes damit machen können.

use admin
db.createUser(
  {
    "user": "myuser",
    "pwd": "password",
    "roles": [
      { "role": "readWrite", "db": "mydb" },
      "readAnyDatabase"
    ]
  }
)

Schauen wir uns nur für zusätzliche Ausgaben die aktuell erstellten Benutzer an:

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"
                        }
                ]
        }
]

Sehen Sie, wie sich diese in der Benennung erweitert haben, und insbesondere die Werte, die den verschiedenen "db" zugewiesen wurden Schlüssel für jeden Benutzer. Dies sollte Ihnen einen etwas besseren Einblick geben, wie MongoDB dies nachschlägt und warum.

Python-Verbindung

Schließlich wollen wir nur eine Verbindung von Python herstellen. Angenommen, Sie haben Python und Pymongo bereits installiert, dann ist es nur eine einfache Auflistung, die überprüft werden muss:

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)

Was zeigt, dass das Dokument problemlos erstellt und aufgelistet wurde:

{u'a': 1, u'_id': ObjectId('5a08e5e0760108251722a737')}

Beachten Sie, dass "admin" eigentlich nicht erwähnt werden muss hier, weil dies die Voreinstellung ist, wo der Treiber "die Konten erwartet" und wo Sie es wirklich tun "sollten".

Aber ich habe es falsch gemacht

Nehmen wir also an, Sie waren ursprünglich völlig verwirrt und haben den Benutzer unter "mydb" erstellt stattdessen:

use mydb
db.createUser({ "user": "bert", "pwd": "password", "roles": ["readWrite"] })

Wenn Sie gehen, schauen Sie in "admin" nach dieser Benutzer ist nicht da. Aber wenn Sie auf "mydb" schauen :

use mydb
db.getUsers()
[
        {
                "_id" : "mydb.bert",
                "user" : "bert",
                "db" : "mydb",
                "roles" : [
                        {
                                "role" : "readWrite",
                                "db" : "mydb"
                        }
                ]
        }
]

So können Sie sehen, wo die tatsächlichen Benutzerdaten jetzt gespeichert sind und wie sie aufgezeichnet wurden.

Der einfache Fall hier ist, dass Sie MongoDB mitteilen „müssen“, woher Sie die Authentifizierung für diesen Benutzer erhalten:

client = MongoClient('mongodb://bert:[email protected]:37017/mydb');

Sehen Sie, wie wir "mydb" hinzufügen auf die Verbindungszeichenfolge. So wird's gemacht.

Dies ist tatsächlich "in Bearbeitung", um mit ALLEN Treibern konsistent zu sein, wie Verbindungen hergestellt werden und wo die Authentifizierung erfolgt sowie wo Sie die Datenbank auswählen. Aber es gibt Grundregeln:

  1. Wenn kein anderer Datenbank-Namespace mit Verbindungsdetails für Authentifizierungsdaten bereitgestellt wird, dann "admin" wird als Standard angenommen .

  2. Wenn in der Verbindungszeichenfolge ein Datenbank-Namespace angegeben ist, wird dieser zur Authentifizierung verwendet und dies ist die eigentliche Absicht des Datenbank-Namensraums in der Verbindungszeichenfolge.

  3. Obwohl sich andere Treiber "derzeit" in der Rolle des Datenbank-Namespace in der Verbindungszeichenfolge unterscheiden, wird die Verwendung geändert, um mit allen Treibern konsistent zu sein, dass die "Verwendung" eines Datenbank-Namespace tatsächlich ein API-Aufruf ist, anstatt von der zugewiesen zu werden Verbindungszeichenfolge.

Wo Sie sich also authentifizieren müssen, hängt davon ab, "wo Sie den Benutzer erstellt haben". Aber Sie sollten wirklich darauf achten, dass "admin" ist der Ort, an dem Sie dies tun "sollten" und nicht anderswo.