Изглежда, че пропускате някои концепции тук, така че ще отговоря основно като "ръководство" за това, което трябва да правите вместо това. Така че „удостоверяването“ всъщност не е нещо, което правите „след“ свързване, а по-скоро трябва да „търсите на правилното място“, когато всъщност се опитвате да удостоверите.
Можем да започнем това, като по същество следваме процеса, описан в Активиране на удостоверяване от основната документация, но специално променена, защото искате да изпълнявате този „тест“ под собствения си потребителски акаунт и локална директория.
Стъпки за преразглеждане – направо от документацията
Така че първо бих искал да избера локална работна директория и да направя път за файловете за съхранение на базата данни под нея. На *nix базирани системи можете да направите нещо като:
mkdir -p scratch/data/db
cd scratch
След това искаме да стартираме отделен екземпляр на MongoDB без други опции. Уверете се, че портът не е в конфликт с друг работещ екземпляр:
mongod --port 37017 --dbpath data/db
След това в нов терминал или прозорец на командния ред можете да се свържете с обвивката:
mongo --port 37017
Винаги искате поне един акаунт с администраторски привилегии поне да „създавате акаунти“ и да ги променяте, в случай че имате проблеми, така че създайте такъв:
use admin
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
}
)
Сега излезте от обвивката и затворете съществуващия mongod
екземпляр, работещ в другия терминал или командния ред, и след това го стартирайте отново с --auth
:
mongod --auth --port 37017 --dbpath data/db
Конкретен потребител - Уверете се, че следвате тези
Сега всъщност искате да създадете потребител, който ще бъде "използван от вашето приложение". Така че тези стъпки са важни, за да сте сигурни, че ще го направите правилно.
Влезте в shell, като използвате вашия „административен потребител“:
mongo -u admin -p admin --port 37017 --authenticationDatabase 'admin'
Можете алтернативно да направите db.auth()
метод, както е показано във въпроса, но както е отбелязано това трябва бъдете упълномощени на "admin"
пространство от имена.
Следващото нещо, което искате да направите, е да създадете потребител с достъп до "mydb"
като пространство от имена с readWrite
роля. За удоволствие, ние също ще позволим на този потребител да има readAnyDatabase
което им позволява да „списват“ всички пространства от имена на бази данни, ако всъщност не могат да правят нещо друго с тях.
use admin
db.createUser(
{
"user": "myuser",
"pwd": "password",
"roles": [
{ "role": "readWrite", "db": "mydb" },
"readAnyDatabase"
]
}
)
Само за допълнителен изход, нека да разгледаме текущите създадени потребители:
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"
}
]
}
]
Вижте как те се разшириха в наименуването и по-специално стойностите, присвоени на различните "db"
ключове за всеки потребител. Това трябва да ви даде малко повече представа за това как MongoDB разглежда това и защо.
Python връзка
Накрая просто искаме да се свържем от python. Така че, ако приемем, че вече имате инсталирани python и pymongo, това е просто прост списък за проверка:
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)
Което показва документа, създаден и посочен без проблем:
{u'a': 1, u'_id': ObjectId('5a08e5e0760108251722a737')}
Обърнете внимание, че всъщност не е необходимо да споменаваме "admin"
тук, защото това е стандартното място, където драйверът „очаква да бъдат акаунтите“ и където наистина „трябва“ да го правите.
Но го направих по грешния начин
Да кажем, че първоначално сте се объркали и сте създали потребителя под "mydb"
вместо това:
use mydb
db.createUser({ "user": "bert", "pwd": "password", "roles": ["readWrite"] })
Ако отидете, погледнете в "admin"
този потребител не е там. Но ако погледнете "mydb"
:
use mydb
db.getUsers()
[
{
"_id" : "mydb.bert",
"user" : "bert",
"db" : "mydb",
"roles" : [
{
"role" : "readWrite",
"db" : "mydb"
}
]
}
]
Така че можете да видите къде сега се съхраняват действителните потребителски данни и как са записани.
Простият случай тук е, че „трябва“ да кажете на MongoDB откъде да получи удостоверяването за този потребител:
client = MongoClient('mongodb://bert:[email protected]:37017/mydb');
Вижте как добавяме "mydb"
върху низа за свързване. Ето как се прави.
Това всъщност е „в процес“, за да бъде съгласувано с ВСИЧКИ драйвери за това как се правят връзки и къде се извършва удостоверяването, както и къде избирате базата данни. Но има основни правила:
-
Ако не е предоставено друго пространство от имена на база данни с подробности за връзката за идентификационни данни за удостоверяване, тогава
"admin"
се приема за по подразбиране . -
Когато в низа за свързване има пространство от имена на база данни, това ще се използва за удостоверяване и това е действителното предназначение на пространството от имена на базата данни в низа за връзка.
-
Въпреки че други драйвери "в момента" се различават в ролята на пространството от имена на базата данни в низа за свързване, използването се променя, за да бъде съвместимо с всички драйвери, че "използването" на пространство от имена на база данни всъщност е извикване на API, вместо да се присвоява от низ за връзка.
Така че къде трябва да удостоверите зависи от това "къде сте създали потребителя". Но наистина трябва да отбележите, че "admin"
е мястото, където „трябва“ да правите това, вместо където и да е другаде.