MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Uwierzytelnij się po wybraniu bazy danych

Wygląda na to, że brakuje Ci tu pewnych pojęć, więc zasadniczo odpowiem jako „przewodnik” po tym, co powinieneś robić. Tak więc „uwierzytelnianie” nie jest czymś, co robisz „po” połączeniu, ale raczej musisz „szukać we właściwym miejscu”, gdy faktycznie próbujesz uwierzytelnić.

Możemy to rozpocząć, zasadniczo postępując zgodnie z procesem opisanym w Włącz uwierzytelnianie z podstawowej dokumentacji, ale specjalnie zmienione, ponieważ chcesz uruchomić ten „test” na własnym koncie użytkownika i w lokalnym katalogu.

Kroki weryfikacyjne — bezpośrednio z dokumentacji

Więc najpierw chciałby wybrać lokalny katalog roboczy i utworzyć ścieżkę do plików przechowywania bazy danych pod nim. W systemach opartych na *nix możesz zrobić coś takiego:

mkdir -p scratch/data/db
cd scratch

Następnie chcemy uruchomić oddzielną instancję MongoDB bez żadnych innych opcji. Upewnienie się, że port nie powoduje konfliktu z żadną inną uruchomioną instancją:

mongod --port 37017 --dbpath data/db

W nowym terminalu lub oknie wiersza poleceń możesz połączyć się z powłoką:

mongo --port 37017

Zawsze chcesz mieć co najmniej jedno konto z uprawnieniami administratora, aby przynajmniej „tworzyć konta” i zmieniać je w razie kłopotów, więc utwórz jedno:

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

Teraz wyjdź z powłoki i zamknij istniejącego mongod instancja uruchomiona w innym terminalu lub wierszu poleceń, a następnie uruchom ją ponownie za pomocą --auth :

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

Określony użytkownik — upewnij się, że przestrzegasz tych

Teraz faktycznie chcesz utworzyć użytkownika, który będzie „używany przez twoją aplikację”. Dlatego te kroki są ważne, aby upewnić się, że zrobisz to dobrze.

Zaloguj się do powłoki, używając swojego "użytkownika administracyjnego":

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

Możesz alternatywnie wykonać db.auth() metoda pokazana w pytaniu, ale jak wspomniano, musi być autoryzowanym przez "admin" przestrzeń nazw.

Następną rzeczą, którą chcesz zrobić, to utworzyć użytkownika z dostępem do "mydb" jako przestrzeń nazw z readWrite rola. W przypadku wykopów zamierzamy również pozwolić temu użytkownikowi na korzystanie z readAnyDatabase pozwalając im na "listowanie" wszystkich przestrzeni nazw baz danych, jeśli w rzeczywistości nie są w stanie zrobić z nimi nic innego.

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

Aby uzyskać dodatkowe dane, spójrzmy na aktualnie utworzonych użytkowników:

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

Zobacz, jak rozwinęły się one w nazewnictwie, a zwłaszcza wartości przypisane do różnych "db" klawisze na każdym użytkowniku. To powinno dać ci trochę więcej informacji o tym, jak MongoDB to wyszukuje i dlaczego.

Połączenie Pythona

Na koniec chcemy po prostu połączyć się z Pythona. Zakładając więc, że masz już zainstalowane python i pymongo, to jest to tylko prosta lista do zweryfikowania:

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)

Który pokazuje dokument utworzony i wyświetlony bez problemu:

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

Zauważ, że tak naprawdę nie musimy wspominać o "admin" tutaj, ponieważ jest to ustawienie domyślne, w którym kierowca "oczekuje konta" i gdzie naprawdę "powinniście" to robić.

Ale zrobiłem to w niewłaściwy sposób

Załóżmy więc, że początkowo się pomyliłeś i utworzyłeś użytkownika pod "mydb" zamiast tego:

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

Jeśli pójdziesz, zajrzyj do "admin" tego użytkownika nie ma. Ale jeśli spojrzysz na "mydb" :

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

Dzięki temu możesz zobaczyć, gdzie są teraz przechowywane rzeczywiste dane użytkownika i jak zostały zapisane.

Prosty przypadek jest taki, że „musisz” powiedzieć MongoDB, skąd uzyskać uwierzytelnienie dla tego użytkownika:

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

Zobacz, jak dodajemy "mydb" na ciąg połączenia. Tak to się robi.

W rzeczywistości jest to „w toku”, które ma być zgodne ze WSZYSTKIMI sterownikami w zakresie nawiązywania połączeń i miejsca uwierzytelniania, a także wyboru bazy danych. Ale są podstawowe zasady:

  1. Jeśli nie podano żadnej innej przestrzeni nazw bazy danych ze szczegółami połączenia dla danych uwierzytelniających, wtedy "admin" jest uważany za domyślny .

  2. Jeśli w ciągu połączenia znajduje się przestrzeń nazw bazy danych, zostanie ona użyta do uwierzytelniania i to jest rzeczywista intencja przestrzeni nazw bazy danych w ciągu połączenia.

  3. Chociaż inne sterowniki „obecnie” różnią się rolą przestrzeni nazw bazy danych w ciągu połączenia, użycie jest zmieniane tak, aby było spójne ze wszystkimi sterownikami, że „używanie” przestrzeni nazw bazy danych jest w rzeczywistości wywołaniem interfejsu API, a nie jest przypisywane z ciąg połączenia.

Tak więc miejsce, w którym musisz uwierzytelnić, zależy od tego, „gdzie utworzyłeś użytkownika”. Ale naprawdę powinieneś zauważyć, że "admin" to miejsce, w którym „powinieneś” to robić, a nie gdziekolwiek indziej.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sterownik PHP mongodb sprawdza połączenie

  2. Mongoose wydaje się zawodzić po cichu

  3. Obiekty nie są poprawne jako dane podrzędne React z MongoDB

  4. Mongodb dopasowuje znaki akcentowane jako podstawowy znak

  5. jak uzyskać zwracaną wartość func findAndModify w MongoDB za pomocą mongoose?