django Пользовательские разрешения DRF: разрешения на уровне просмотра для подробных видов - PullRequest
1 голос
/ 01 февраля 2020

Я не уверен, как обращаться с разрешениями в подробных видах (например, api/teams/<int:pk>). Предположим, у меня есть собственный класс разрешений, который должен разрешать доступ, если запрашивающий пользователь находится в запрашиваемой команде.

что-то вроде:

class IsInTeam(BasePermission):
  def has_permission(self, request, view):
    # should I implement this at all?

  def has_object_permission(self, request, view, team):
    return team.hasMember(request.user)

Поскольку вызывается has_object_permission в любом случае (поскольку представления «сток» проверяют разрешения при вызове get_object в соответствии с документами ):

Примечание : Уровень экземпляра has_object_permission метод будет вызываться только в том случае, если проверки на уровне представления has_permission уже пройдены. Также обратите внимание, что для запуска проверок на уровне экземпляра код представления должен явно вызывать .check_object_permissions(request, obj). Если вы используете общие c представления, то это будет обработано для вас по умолчанию.

Теперь, согласно этому, has_object_permission будет проверяться только, если has_permission вернул True. Хотя это имеет смысл, можно утверждать, что, поскольку это представление строго основано на CRUD операциях над конкретным c объектом, обозначенным pk, все необходимые проверки могут выполняться в методе has_permission.

Вопрос : Это будет плохой практикой? Если так, то почему? Единственная причина, по которой я могу придумать, состоит в том, что в has_permission нужно было бы проверить, существует ли объект вообще. Это было бы несколько запутанным, поскольку проверки разрешений не должны проверять, существует ли объект.

...