Я разрабатываю авторизацию приложения DRF. Мне нужно использовать роли, а не только разрешения.Проектирование авторизации на основе ролей Django Rest Framework
У меня есть модель (например, project
), в которой у меня есть некоторая информация (например, имя, описание), которые могут быть изменены некоторыми ролями (например, admin
). Но в то же время существуют и другие роли (например, worker
), которые не могут изменять эту информацию внутри этой модели, но могут изменять некоторые другие данные (например, начальную и конечную даты).
Я думал о двух решениях для этой проблемы. Первый - это чтение отправленного HTTP-запроса и определение действий, которые необходимо предпринять в зависимости от того, что представляет собой запрос. Это означает, что каждый раз, когда в модель добавляется новое поле, мне придется изменить эту логику. Это звучит ужасно сложно для поддержания, подвержено ошибкам и может вводить уязвимости.
С другой стороны, я думал, что могу разделить модель на две разные модели. Один из них содержит данные, которые могут изменять только одна роль (admin
), а другая - другие данные, которые могут быть изменены обоими ролями (admin
, worker
). Таким образом, мне не придется анализировать HTTP-запрос, потому что, если я получаю запрос POST/PUT, влияющий на первую модель, и у пользователя есть рабочая роль, я могу прямо ее отклонить.
Эта ситуация случается с более чем одной моделью.
Я хотел бы знать, есть ли способ по умолчанию или если я изобретаю колесо. Я думаю, что эта ситуация должна быть действительно распространенной. Например, я могу придумать проект git, в котором некоторые пользователи имеют доступ к тому, чтобы делать что-то внутри проекта, но не другие.
Дополнительные примечания (обратная связь будет очень ценится):
я, скорее всего, будет использовать django-role-permissions модуль для выполнения ролей и разрешений. Я не могу использовать встроенные группы django, потому что, хотя вы можете добавлять к ним разрешения, я буду использовать их для группировки пользователей (не имея ничего общего с ролями).
Я создам связь между ролями и разрешениями (разрешение на основе строк, такое как ,
modify_project_description
) в файле разрешений.При получении каждого запроса я проверю, какие роли имеют полномочия для выполнения этого действия, и проверить, является ли пользователь какой-либо из этих ролей (авторизация на основе активности, что означает, что в конечной точке я проверю действие/действие вместо этого роли).
Вы заслуживаете повышения, потому что я в конечном итоге реализую все, что вы упоминаете (кроме прокси-модели). – newlog