2014-02-10 3 views
1

1) Перед установку даже наборы реплик в Монго я создал пользователь с правами администратора, с «readWriteAnyDatabase», «userAdminAnyDatabase», «dbAdminAnyDatabase», «clusterAdmin» ролями.Не удается проверить подлинность с mongoenine к MongoDB реплик

2) Затем я устанавливаю свои конфигурации /etc/mongodb.conf на всех 3 серверах.

dbpath=/var/lib/mongodb 
logpath=/var/log/mongodb/mongodb.log 
logappend=true 
port = 27017 
auth = true 
replSet = test4 

3) инициированные реплики, но получил ошибки (Не помню точно, что была ошибка, но что-то связанное с этим одной из сервера не вышло. Так что я решил, что он просто не может аутентификации)

config = {"_id" : "test4", "version" : 1, "members" : [{"_id" : 0,"host" : "xxx.xxx.xxx.xxx:27017"}, {"_id" : 1,"host" : "xxx.xxx.xxx.xxx:27017"}, {"_id":2,"host" : "xxx.xxx.xxx.xxx:27017"}]} 

rs.initiate(config) 

4) чтобы решить эту ошибку, я генерироваться кеуген и добавил аутентификацию кеуген в мой файл mongodb.conf.

dbpath=/var/lib/mongodb 
keyFile = /etc/keyFile 
logpath=/var/log/mongodb/mongodb.log 
logappend=true 
port = 27017 
auth = true 
replSet = test4 

И все работает как шарм. База данных копировала себя поверх реплик. Пользователь Admin работал так же, как ожидалось.

5) Тогда я создал пользователя со всеми необходимыми разрешениями для другой базы данных, у меня есть, давайте назовем это «testdb» и пользователем: notadmin, pass: notadmin.

Но есть одна странная вещь, которую я заметил. Когда я вхожу Монго в консоли я не вижу реплик, пока я не войти базы данных администратора в качестве администратора, как это:

use admin 
db.auth('admin', 'admin') 

Тогда мои консольных изменения в test4: Primary> или test4: СРЕДНЯЯ> и я могу выполнять действия с репликами. Полагаю, это должно быть так.

И все работает отлично, если я вставляю данные через библиотеку pymongo. Разрешения работают, пользователь admin может вставлять в любую базу данных, данные разрешения, а пользователь notadmin может вставлять в testdb.

Но если я пытаюсь сделать то же самое с моделями mongoengine,

mongodsn = 'mongodb://notadmin:[email protected]:27017,xx.x.xx.xxx:27017,xxx.xxx.xxx.xx:27017/' 
db_instance = mongoengine.connect('testdb', host=mongodsn, replicaSet='test4', readPreference='secondaryPreferred') 
rt = ReconnectTest() 
rt.content = 'item#{0:d}'.format(x) 
rt.save() 

я получаю ошибку аутентификации:

mongoengine.errors.OperationError: Could not save document (command SON([('authenticate', 1), ('user', u'notadmin'), ('nonce', u'9ae2f85cd41f6c74'), ('key', u'8f814aa2434s4t2e0ff9bae03762e')]) failed: auth fails)

Единственное, что она позволяет мне от пользователя с правами администратора, чтобы написать администратору база данных. Так что-то вроде это работает:

mongodsn = 'mongodb://admin:[email protected]:27017,xx.x.xx.xxx:27017,xxx.xxx.xxx.xx:27017/' 
db_instance = mongoengine.connect('admin', host=mongodsn, replicaSet='test4', readPreference='secondaryPreferred') 
rt = ReconnectTest() 
rt.content = 'item#{0:d}'.format(x) 
rt.save() 

Я так растерялся, потому что mongoengine просто обертка вокруг PyMongo. Так почему я могу делать действия с pymongo, и не могу сделать то же самое с mongoenige. Как выполнить проверку подлинности с помощью mongoengine на testdb?

+0

ли вам когда-нибудь решить это? – okoboko

ответ

1

Вы должны создать пользователя по базе данных «TestDB», следующим образом:

$ mongo admin -u <username> -p <password> 
> use testdb 
> db.addUser({user: <username>, pwd: <password>, roles: [<permissions>]}) 

Затем пытается подключиться через mongoengine с помощью вновь созданного пользователя.

Кроме того, добавьте базу данных в строке подключения, как таковой:

'MongoDB: // notadmin: [email protected]: 27017/TESTDB'

+0

Извините, может быть, я не был достаточно ясен в своем вопросе. Я создал notadmin пользователя в testdb. И этот пользователь не работает ни через mongoengine. – Viktor

+0

Хорошо, это хорошо. Вы пытались указать базу данных в строке dsn? Например. mongodsn = 'mongodb: // notadmin: [email protected]: 27017/testdb, xx.x.xx.xxx: 27017, xxx.xxx.xxx.xx: 27017/testdb' – Rishi

+0

Не помогло , Но я понял что-то еще. Я могу вставлять данные в любую таблицу с учетными данными pymongo и admin (имеет все разрешения). Я не могу вставлять какие-либо данные с пользователем pymongo и notadmin, потому что кажется, что он по-прежнему пытается сначала аутентифицироваться в базе данных администратора, и, конечно же, он терпит неудачу, учитывая, что это notadmin пользователь. И с mongoengine я могу вставить только в базу данных администратора с пользователем администратора. – Viktor

Смежные вопросы