Какие права пользователя MongoDB мне нужно добавить в новую/другую базу данных mongo?

Я включил аутентификацию в конфигурационном файле MongoDB после добавления одного пользователя-администратора со следующими привилегиями: userAdmin и userAdminAnyDatabase.

Теперь я соединяюсь с этим пользователем с db, где этот администратор настроен (в противном случае я получаю exception: login failed).

После того, как я успешно подключился, я хочу добавить нового пользователя в новую базу данных. Для этого я пытаюсь:

use another
db.addUser(...)

но я получаю сообщение об ошибке:

Wed Dec 11 17:45:18.277 couldn't add user: not authorized for insert on app.system.users at src/mongo/shell/db.js:128

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


Подробный (все пользователи имеют 1234 в качестве пароля в этом примере)

$ mongo mono -u admin_all -p 1234
MongoDB shell version: 2.4.6
connecting to: mono
> db.system.users.find()
{ "_id" : ObjectId("52a9831de41eb640bb0f5f64"), "user" : "admin_all", "pwd" : "a6316ed4886c10663cce46bc216ea375", "roles" : [  "userAdmin",  "userAdminAnyDatabase" ] }
{ "_id" : ObjectId("52a98404ef1f9bc934b62e11"), "user" : "admin_one", "pwd" : "884f516cf308a4c6a75bbc5a0a00807b", "roles" : [  "userAdmin" ] }
{ "_id" : ObjectId("52a98415ef1f9bc934b62e12"), "user" : "admin_any", "pwd" : "1616611df9b47c58b607054d384cab99", "roles" : [  "userAdminAnyDatabase" ] }
> use another
switched to db another
> db.addUser({ user: "user", pwd: "1234", roles: ["read"] })
{
    "user" : "user",
    "pwd" : "461d4f349d8d4ec3d22a4c945010c330",
    "roles" : [
        "read"
    ],
    "_id" : ObjectId("52a985372fcdbfd033003a7e")
}
Thu Dec 12 10:43:19.091 couldn't add user: not authorized for insert on another.system.users at src/mongo/shell/db.js:128

Ответы

Ответ 1

Ошибка была в том, что я использовал пользователя userAdminAnyDatabase, которого НЕ было в базе данных администратора (см. Это примечание). Так что на вашем сервере ДОЛЖНА быть база данных с именем admin ! Как сказано в документации для привилегий "AnyDatabase":

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

Итак, вы должны:

  • добавить userAdminAnyDatabase в userAdminAnyDatabase admin

    $ mongo admin
    > db.createUser({ user: "myadmin", pwd: "1234", roles: ["userAdminAnyDatabase"] })
    
  • включить аутентификацию

    auth = true
    setParameter = enableLocalhostAuthBypass=0
    
  • подключитесь с помощью нового пользователя myadmin к любой базе данных и добавьте других пользователей:

    $ mongo another -u myadmin -p 1234
    > db.createUser({ user: "user", pwd: "1234", roles: ["readWrite"] })
    

    или же

    > use another
    > db.createUser({ user: "user", pwd: "1234", roles: ["readWrite"] })
    

Ответ 2

Вот что помогло мне создать пользовательский prod который подключается к prod базы данных, предполагая, что у меня уже есть пользователь-администратор (называемый admin) в MongoDB:

> mongo admin --username root --password <pwd>
> use prod
> db.createUser(
  {
    user: "prod",
    pwd: "<pwd>",
    roles: [ { role: "dbOwner", db: "prod" } ]
  }
)
> exit

После этого вы можете войти с новым пользователем prod как это:

> mongo prod  --username prod --password <pwd>