Это мое разрешение:DjangoRestFramework - has_permission неправильно перекрывая has_object_permission
class IsCreationOrAuthenticatedOrIsOwnerOrWatchOrReadOnly(permissions.BasePermission):
"""
Allow only the owner (and admin) of the object to make changes (i.e.
do PUT, PATCH, DELETE and POST requests. Allow all other users
ReadOnly or Follow options. This is for UserViewSet. Allow unauthenticated users to
create objects.
"""
def has_permission(self, request, view):
if not request.user.is_authenticated():
if view.action == 'create':
return True
return False
return request.method in permissions.SAFE_METHODS or request.user.is_staff or view.action=='follow'
def has_object_permission(self, request, view, obj):
if not request.user.is_authenticated():
return False
if request.method in permissions.SAFE_METHODS:
return True
if request.user.is_staff:
return True
if view.action == 'follow':
return True
return obj.owner == request.user
Проблема заключается в том, что прошедшие проверку подлинности пользователи не могут PUT, PATCH или удалить свой счет, потому что в has_permission
он говорит:
return request.method in permissions.SAFE_METHODS or request.user.is_staff or view.action=='follow'
Однако , PUT, PATCH и DELETE здесь зависит от того, obj.owner == request.user
(это зависит от объекта). Итак, как я могу разрешить пользователям PUT, PATCH и DELETE только их учетную запись, когда has_permission
не имеет доступа к объекту и поэтому не должен допускать никаких PUT, PATCH и DELETE (потому что все зависит от того, obj.owner == request.user
.
Почему вы не удалите чеки 'has_permission' и позволяют небезопасные методы? Они будут проверены в' has_object_permission' все равно –
@RetoAebersold Поскольку создание объектов и получение списка объектов не обрабатывается 'has_object_permission', оно обрабатывается' has_permission'. nd Мне нужно убедиться, что пользователи, не прошедшие проверку подлинности, не могут получить список объектов, но имеют доступ к POST (создание объектов). – user2719875