#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»}]}). Теперь у него есть право обновлять любые роли пользователей.