Django REST Framework 只允许超级用户访问 api 网络视图
Django REST Framework allow only superusers to access api web view
我正在使用 Django 2.0
和 Django RESET Framework
为我的应用程序编写 REST API
。
我配置了以下身份验证方法
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
}
截至目前,它允许所有经过身份验证的用户访问 web api
视图。
我想要的是允许少数用户(可能是超级管理员用户)能够通过会话身份验证或通过登录从 Web 浏览器访问 API。
Edit 2: contacts/views.py
class ContactViewSet(viewsets.ModelViewSet):
queryset = Contact.objects.all()
serializer_class = ContactSerializer
permission_classes = (IsAuthenticated,)
def perform_create(self, serializer):
serializer.save(user_id=self.request.user)
所以您可以利用 permission_classes
来做到这一点。 DRF 的 Request
对象会记住在名为 _authenticator
的属性中使用的身份验证方法。你可以用这个;并使用 permission_classes 来确定这对 (user, authenticator) 是否具有权限
class AdminAuthenticationPermission(permissions.BasePermission):
ADMIN_ONLY_AUTH_CLASSES = [rest_framework.authentication.BasicAuthentication, rest_framework.authentication.SessionAuthentication]
def has_permission(self, request, view):
user = request.user
if user and user.is_authenticated():
return user.is_superuser or \
not any(isinstance(request._authenticator, x) for x in self.ADMIN_ONLY_AUTH_CLASSES)
return False
class ContactViewSet(viewsets.ModelViewSet):
queryset = Contact.objects.all()
serializer_class = ContactSerializer
permission_classes = (IsAuthenticated, AdminAuthenticationPermission,)
未测试:但应该有效
对于 Django 2(在 views.py 中添加)
from rest_framework.permissions import IsAdminUser
class IsSuperUser(IsAdminUser):
def has_permission(self, request, view):
return bool(request.user and request.user.is_superuser)
class ListSmth(ListCreateAPIView):
permission_classes = (IsSuperUser,)
... Your code...
已经有一个名为 IsAdminUser 的内置 class,将其指定为 permission_classes 属性
的值
from rest_framework.permissions import IsAdminUser
class A:
permission_classes = (IsAdminUser,)
这会检查值
reques.user.isStaff == True
我正在使用 Django 2.0
和 Django RESET Framework
为我的应用程序编写 REST API
。
我配置了以下身份验证方法
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
}
截至目前,它允许所有经过身份验证的用户访问 web api
视图。
我想要的是允许少数用户(可能是超级管理员用户)能够通过会话身份验证或通过登录从 Web 浏览器访问 API。
Edit 2: contacts/views.py
class ContactViewSet(viewsets.ModelViewSet):
queryset = Contact.objects.all()
serializer_class = ContactSerializer
permission_classes = (IsAuthenticated,)
def perform_create(self, serializer):
serializer.save(user_id=self.request.user)
所以您可以利用 permission_classes
来做到这一点。 DRF 的 Request
对象会记住在名为 _authenticator
的属性中使用的身份验证方法。你可以用这个;并使用 permission_classes 来确定这对 (user, authenticator) 是否具有权限
class AdminAuthenticationPermission(permissions.BasePermission):
ADMIN_ONLY_AUTH_CLASSES = [rest_framework.authentication.BasicAuthentication, rest_framework.authentication.SessionAuthentication]
def has_permission(self, request, view):
user = request.user
if user and user.is_authenticated():
return user.is_superuser or \
not any(isinstance(request._authenticator, x) for x in self.ADMIN_ONLY_AUTH_CLASSES)
return False
class ContactViewSet(viewsets.ModelViewSet):
queryset = Contact.objects.all()
serializer_class = ContactSerializer
permission_classes = (IsAuthenticated, AdminAuthenticationPermission,)
未测试:但应该有效
对于 Django 2(在 views.py 中添加)
from rest_framework.permissions import IsAdminUser
class IsSuperUser(IsAdminUser):
def has_permission(self, request, view):
return bool(request.user and request.user.is_superuser)
class ListSmth(ListCreateAPIView):
permission_classes = (IsSuperUser,)
... Your code...
已经有一个名为 IsAdminUser 的内置 class,将其指定为 permission_classes 属性
的值from rest_framework.permissions import IsAdminUser
class A:
permission_classes = (IsAdminUser,)
这会检查值
reques.user.isStaff == True