dbowner «не авторизован» для обновления пользователя?

#mongodb

#mongodb

Вопрос:

Я пытаюсь обновить роли пользователя.

Итак, я попробовал следующую команду с администратором-пользователем (который имеет привилегии dbOwner и UserAdmin и создается непосредственно в UnitTestDb)

 db.runCommand({ "updateUser" : "unittestuser1", "roles" : [{ "role" : "Testentity_readwrite", "db" : "UnitTestDb" }, { "role" : "Testentity_read", "db" : "UnitTestDb" }] }
  

Я запускаю эту команду непосредственно в «UnitTestDb», и роль «Testentity_read» также создается непосредственно в этой базе данных.

Я получаю следующую ошибку:

 {
    "ok" : 0,
    "errmsg" : "not authorized on UnitTestDb to execute command { updateUser: "unittestuser1", roles: [ { role: "Testentity_readwrite", db: "UnitTestDb" }, { role: "Testentity_read", db: 
  

«UnitTestDb» } ] }»,
«код»: 13
}

Я могу обновить пользовательские данные для пользователя, но не для роли…

Может кто-нибудь сказать мне, какие привилегии или роли нужны моему пользователю-администратору для выполнения этого обновления?

dbOwner должен иметь полный доступ к базе данных, в которой он был создан (из mongodb.org : Владелец базы данных может выполнять любые административные действия с базой данных. Эта роль сочетает в себе привилегии, предоставленные ролями ReadWrite, DBAdmin и UserAdmin.)

Тобиас

Ответ №1:

Я полагаю, что проблема в том, что UpdateUser требует дополнительных прав для всех баз данных. Из документации:

Требуется доступ

У вас должен быть доступ, включающий действие revokeRole для всех баз данных, чтобы обновить массив ролей пользователя.

У вас должно быть действие grantRole в базе данных роли, чтобы добавить роль пользователю.

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

Я бы попробовал вместо этого использовать команду db.grantRolesToUsers(), поскольку она не требует такого же уровня прав.

http://docs.mongodb.org/manual/reference/method/db.grantRolesToUser/

Требуется доступ

У вас должно быть действие grantRole для базы данных, чтобы предоставить роль в этой базе данных.

В качестве альтернативы вы можете убедиться, что пользователь, выполняющий команду UpdateUser, имеет право на отзыв во всех базах данных.

Комментарии:

1. спасибо за ваш быстрый ответ! Я хочу использовать метод UpdateUser, потому что я ожидаю от клиента полный список ролей, а затем я могу просто обновить все роли одной командой. Когда я буду использовать grantRolesToUser или RevokeRolesFromUser, мне придется проверять роли самостоятельно. Вы знаете, какая роль отсутствует? Я бы просто предоставил пользователю-администратору эту привилегию.

2. Я обновил ответ, вы могли бы изменить admin-user, чтобы у него был revokeRole прямо во всех базах данных.

3. еще раз спасибо. Мне пришлось создать роль внутри admin-db с такими привилегиями: db.createRole({роль: «myRole», привилегии: [{ресурс: {db: «», коллекция: «»»}, действия: [«revokeRole»]}], роли: [{роль: «dbOwner», db: «MyTestDb»}]}). Теперь у него есть право обновлять любые роли пользователей.