DRF 自定义权限:允许 'retrieve'、拒绝 'list'
DRF custom permission: allow 'retrieve', deny 'list'
tldr:我想获得许可,允许 'retrieve' 操作但不允许 'list'。
我正在使用 Django Rest Framework 编写 REST API,但在创建自定义权限时遇到了问题(对于来自 viewsets.ModelViewSet 的视图)
在创建端点时遇到困难,该端点应该 return 站点用户:
-管理员应该有权访问每个方法
-普通用户应该只能'retrieve'和'patch'他自己的帐户
我找不到区分 GET 请求 'list' 和 'retrieve' 的方法。
检查 request.method == GET
允许他们两个,但我不希望用户能够列出所有其他用户。
from rest_framework.permissions import BasePermission
```
def is_superuser(request):
return request.user.is_superuser
```
class IsAdminOrReadOnlyOwner(BasePermission):
def has_permission(self, request, view):
if is_superuser(request):
return True
else:
return request.method in ['GET', 'PATCH']
def has_object_permission(self, request, view, obj):
is_owner_and_safe = int(request.user.id) == obj.id and request.method in ['GET', 'PATCH']
return is_owner_and_safe or is_superuser(request)
有没有办法做到这一点,仍然使用 ModelViewSet?
尝试在你的 mixin 中使用 self.action
方法。它会给你列出、检索、更新、销毁你的操作方法,
检查权限时,Django Rest 将视图传递给权限 class 方法,从视图中您可以确定操作。您可以在源代码 here.
中查看 has_object_permission
和 RetrieveAPIView
的示例
您可以使用view.action
从您的权限class方法中识别操作,例如:
def has_permission(self, request, view):
if is_superuser(request):
return True
else:
return view.action in ['retrieve', 'update']
您可以在 has_object_permission
中检查 view.action
以获得您想要的结果。
tldr:我想获得许可,允许 'retrieve' 操作但不允许 'list'。
我正在使用 Django Rest Framework 编写 REST API,但在创建自定义权限时遇到了问题(对于来自 viewsets.ModelViewSet 的视图)
在创建端点时遇到困难,该端点应该 return 站点用户:
-管理员应该有权访问每个方法
-普通用户应该只能'retrieve'和'patch'他自己的帐户
我找不到区分 GET 请求 'list' 和 'retrieve' 的方法。
检查 request.method == GET
允许他们两个,但我不希望用户能够列出所有其他用户。
from rest_framework.permissions import BasePermission
```
def is_superuser(request):
return request.user.is_superuser
```
class IsAdminOrReadOnlyOwner(BasePermission):
def has_permission(self, request, view):
if is_superuser(request):
return True
else:
return request.method in ['GET', 'PATCH']
def has_object_permission(self, request, view, obj):
is_owner_and_safe = int(request.user.id) == obj.id and request.method in ['GET', 'PATCH']
return is_owner_and_safe or is_superuser(request)
有没有办法做到这一点,仍然使用 ModelViewSet?
尝试在你的 mixin 中使用 self.action
方法。它会给你列出、检索、更新、销毁你的操作方法,
检查权限时,Django Rest 将视图传递给权限 class 方法,从视图中您可以确定操作。您可以在源代码 here.
中查看has_object_permission
和 RetrieveAPIView
的示例
您可以使用view.action
从您的权限class方法中识别操作,例如:
def has_permission(self, request, view):
if is_superuser(request):
return True
else:
return view.action in ['retrieve', 'update']
您可以在 has_object_permission
中检查 view.action
以获得您想要的结果。