Dan*_*usy 3 django permissions django-rest-framework
我正在使用 Django Rest Framework 作为我的 API 服务。在我的 settings.py 中,我有以下 REST_FRAMEWORK 设置:
REST_FRAMEWORK = {
...
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated'
)
...
}
Run Code Online (Sandbox Code Playgroud)
现在我想更改权限类别以允许任何人使用一个视图。我使用了 @permission_classes 装饰器。
class UserViewSet(viewsets.ModelViewSet):
serializer_class = RegisterSerializer
queryset = User.objects.all()
@permission_classes([permissions.AllowAny,])
def create(self, request, *args, **kwargs):
data = request.data
...
Run Code Online (Sandbox Code Playgroud)
我应该能够在没有任何权限的情况下执行创建操作。相反,当我尝试访问 API 时收到身份验证错误。
"detail": "Authentication credentials were not provided."
Run Code Online (Sandbox Code Playgroud)
根据文档@permission_classes 装饰器是这种权限覆盖的正确方法。这是 Django 2.2.4 和 DRF 3.10.2。
我忘了提及,我不想允许任何人访问任何视图,而只允许访问所选的视图。大多数视图应该具有全局设置的 IsAuthenticated 权限。
可以使用 DEFAULT_PERMISSION_CLASSES 设置全局设置默认权限策略。例如。
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
]}
Run Code Online (Sandbox Code Playgroud)
如果未指定,此设置默认允许无限制访问:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny',
]}
Run Code Online (Sandbox Code Playgroud)
如需进一步参考,您可以查看 DRF 文档doc
编辑:
您可以使用您自己的类来覆盖权限:
from rest_framework import permissions
class SkipAuth(permissions.IsAuthenticated):
def has_permission(self, request, view):
return True
Run Code Online (Sandbox Code Playgroud)
并使用此类跳过特定功能的身份验证,如下所示:
@permission_classes([SkipAuth])
def create(self, request, *args, **kwargs):
data = request.data
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1539 次 |
| 最近记录: |