sql >> Databáze >  >> NoSQL >> MongoDB

Ověření po výběru databáze

Zdá se, že vám zde chybí některé pojmy, takže v podstatě odpovím jako „průvodce“ tím, co byste místo toho měli dělat. Takže „autentizace“ není ve skutečnosti něco, co děláte „po“ připojení, ale spíše musíte „hledat na správném místě“, když se skutečně pokoušíte ověřit.

Můžeme to začít tím, že budeme v podstatě postupovat podle postupu popsaného v Povolit ověření z hlavní dokumentace, ale speciálně upravená, protože chcete tento "test" spouštět pod svým vlastním uživatelským účtem a místním adresářem.

Kroky revize – přímo z dokumentace

Nejprve by tedy chtěl vybrat místní pracovní adresář a vytvořit cestu pro soubory úložiště databáze pod ním. Na systémech založených na *nix můžete udělat něco jako:

mkdir -p scratch/data/db
cd scratch

Poté chceme spustit samostatnou instanci MongoDB bez dalších možností. Ujistěte se, že port není v konfliktu s jinou spuštěnou instancí:

mongod --port 37017 --dbpath data/db

V novém okně terminálu nebo příkazového řádku se pak můžete připojit k shellu:

mongo --port 37017

Vždy chcete, aby alespoň jeden účet s administrátorskými právy alespoň "vytvářel účty" a měnil je v případě, že se dostanete do potíží, takže si jeden vytvořte:

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

Nyní opusťte shell a zavřete existující mongod instanci spuštěnou v jiném terminálu nebo příkazovém řádku a poté ji znovu spusťte pomocí --auth :

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

Konkrétní uživatel – Ujistěte se, že dodržujete tyto

Nyní vlastně chcete vytvořit uživatele, kterého bude „používat vaše aplikace“. Takže tyto kroky jsou důležité, abyste zajistili, že to uděláte správně.

Přihlaste se do shellu pomocí svého „administrativního uživatele“:

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

Alternativně můžete provést db.auth() metodou, jak je uvedeno v otázce, ale jak bylo uvedeno, musí být autorizován na "admin" jmenný prostor.

Další věc, kterou chcete udělat, je vytvořit uživatele s přístupem k "mydb" jako jmenný prostor s readWrite role. Pro kopy také tomuto uživateli umožníme mít readAnyDatabase umožnit jim „vypsat“ všechny jmenné prostory databází, pokud s nimi ve skutečnosti nebudou moci dělat nic jiného.

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

Jen pro další výstup se podívejme na aktuálně vytvořené uživatele:

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

Podívejte se, jak se rozšířily v pojmenování, a zejména hodnoty přiřazené různým "db" klíče u každého uživatele. To by vám mělo poskytnout trochu lepší přehled o tom, jak to MongoDB vyhledává a proč.

Připojení Pythonu

Nakonec se chceme připojit pouze z pythonu. Takže za předpokladu, že už máte nainstalovaný python a pymongo, pak je to jen jednoduchý výpis k ověření:

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)

Což zobrazuje dokument vytvořený a uvedený bez problémů:

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

Všimněte si, že ve skutečnosti nemusíme zmiňovat "admin" zde, protože toto je výchozí nastavení, kdy ovladač „očekává, že účty budou“ a kde byste to skutečně „měli“ dělat.

Ale udělal jsem to špatně

Řekněme tedy, že jste se původně zmátli a vytvořili uživatele pod "mydb" místo toho:

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

Pokud se podíváte do "admin" ten uživatel tam není. Ale když se podíváte na "mydb" :

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

Můžete tedy vidět, kde jsou nyní uchovávána skutečná uživatelská data a jak byla zaznamenána.

Jednoduchý případ je, že „musíte“ sdělit MongoDB, odkud získat ověření pro tohoto uživatele:

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

Podívejte se, jak přidáváme "mydb" na připojovací řetězec. Takto se to dělá.

Toto je ve skutečnosti „probíhá“, aby bylo zajištěno soulad se VŠEMI ovladači v tom, jak se připojují a kde probíhá ověřování, a také kde vybíráte databázi. Existují však základní pravidla:

  1. Pokud není poskytnut žádný jiný jmenný prostor databáze s podrobnostmi o připojení pro autentizační pověření, pak "admin" je považováno za výchozí .

  2. Pokud je v připojovacím řetězci uveden jmenný prostor databáze, bude použit pro ověření a toto je skutečný záměr jmenného prostoru databáze na připojovacím řetězci.

  3. I když se ostatní ovladače „v současnosti“ liší v roli jmenného prostoru databáze v připojovacím řetězci, použití se mění tak, aby bylo konzistentní se všemi ovladači, že „používání“ jmenného prostoru databáze je ve skutečnosti voláním API, nikoli přiřazením z připojovací řetězec.

Kde se tedy potřebujete ověřit, závisí na tom, „kde jste uživatele vytvořili“. Ale měli byste si opravdu uvědomit, že "admin" je místo, kde byste to „měli“ dělat místo kdekoli jinde.




  1. Vytvořte strom uzlů pomocí rekurzivní tabulky pomocí Express a Mongo

  2. Ověření hesla / potvrzení hesla pomocí schématu Mongoose

  3. Je to dobrý případ použití pro Redis na ServiceStack REST API?

  4. MongoDB - Full Text Index - Full Text Search - stemming