📜  基本身份验证 – Django REST 框架

📅  最后修改于: 2022-05-13 01:54:40.376000             🧑  作者: Mango

基本身份验证 – Django REST 框架

身份验证是一种基于与传入请求关联的凭据提供访问控制的机制。 Django REST Framework 提供了多种身份验证方案。在本节中,让我们看看 Django rest 框架中的基本身份验证,即根据用户的用户名和密码进行身份验证。

Django REST Framework 中的基本身份验证使用 HTTP 基本身份验证。它通常适用于测试。 REST framework 将尝试验证 Basic Authentication 类并将返回值设置为 request.user 和 request.auth。如果成功通过身份验证,BasicAuthentication 将提供以下凭据。

  • request.user 将是一个 Django User 实例。
  • request.auth 将为 None。

如果没有,request.user 的值将被设置为 django.contrib.auth.models.AnonymousUser 的一个实例,request.auth 将被设置为 None。要制作 BasicAuthentication 方案,我们需要将其设置为默认的认证方案。您可以全局设置它,也可以在每个视图的基础上设置身份验证方案。

全局设置认证方案

您可以使用 DEFAULT_AUTHENTICATION_CLASSES 设置全局设置身份验证。

Python3
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
    ]
}


Python3
@api_view(['GET'])
@authentication_classes([BasicAuthentication])
@permission_classes([IsAuthenticated])
def function_based_view(request, format=None):
    content = {
        
        # `django.contrib.auth.User` instance
        'user': str(request.user),
        
        # None
        'auth': str(request.auth),
    }
    return Response(content)


Python3
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
  
class ClassBasedView(APIView):
    authentication_classes = [BasicAuthentication]
    permission_classes = [IsAuthenticated]
  
    def get(self, request, format=None):
        content = {
            
            # `django.contrib.auth.User` instance
            'user': str(request.user),
            
            # None
            'auth': str(request.auth),
        }
        return Response(content)


Python3
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES'🙁
        'rest_framework.authentication.BasicAuthentication',
        )
}


Python3
class RobotDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = [IsAuthenticated]
    queryset = Robot.objects.all()
    serializer_class = RobotSerializer
    name = 'robot-detail'
  
  
class RobotList(generics.ListCreateAPIView):
    permission_classes = [IsAuthenticated]
    queryset = Robot.objects.all()
    serializer_class = RobotSerializer
    name = 'robot-list'


设置每个视图的身份验证方案

在基于每个视图的基础上设置身份验证方案在基于功能的视图和基于类的视图中有所不同。

基于函数的视图

我们可以使用@authentication_classes 和@permission_classes 装饰器在使用@api_view 装饰器的基于函数的视图中设置身份验证方案。示例代码如下:

蟒蛇3

@api_view(['GET'])
@authentication_classes([BasicAuthentication])
@permission_classes([IsAuthenticated])
def function_based_view(request, format=None):
    content = {
        
        # `django.contrib.auth.User` instance
        'user': str(request.user),
        
        # None
        'auth': str(request.auth),
    }
    return Response(content)

基于类的视图

通过使用 APIView 类,我们可以在基于类的视图中设置身份验证方案。示例代码如下:

蟒蛇3

from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
  
class ClassBasedView(APIView):
    authentication_classes = [BasicAuthentication]
    permission_classes = [IsAuthenticated]
  
    def get(self, request, format=None):
        content = {
            
            # `django.contrib.auth.User` instance
            'user': str(request.user),
            
            # None
            'auth': str(request.auth),
        }
        return Response(content)

注意:在这里,我们将使用最简单的权限样式,允许任何经过身份验证的用户访问,并拒绝任何未经身份验证的用户访问。这对应于 REST 框架中的“IsAuthenticated”类。如果未设置为“IsAuthenticated”类,则使用默认类“AllowAny”,允许无限制访问。

包括 BasicAuthentication 到 Restful Webservice

让我们全局设置 BasicAuthentication 方案。您可以打开我们的restful web 服务的settings.py 文件并添加以下代码。

蟒蛇3



REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES'🙁
        'rest_framework.authentication.BasicAuthentication',
        )
}

注意:您可以参考文章中使用的模型、序列化程序和项目视图的可浏览 API 部分

这里我们全局设置了 BasicAuthentication 方案,所以不需要为每个视图都设置。但是我们需要设置权限类,因为默认情况下,权限类设置为 AllowAny,允许无限制访问。要使用 IsAuthenticated 类,我们需要从 rest_framework.permissions 导入它。

from rest_framework.permissions import IsAuthenticated

现在,让我们将 RobotDetail 和 RobotList 类的权限类设置为“IsAuthenticated”。代码如下:

蟒蛇3

class RobotDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = [IsAuthenticated]
    queryset = Robot.objects.all()
    serializer_class = RobotSerializer
    name = 'robot-detail'
  
  
class RobotList(generics.ListCreateAPIView):
    permission_classes = [IsAuthenticated]
    queryset = Robot.objects.all()
    serializer_class = RobotSerializer
    name = 'robot-list'

让我们尝试在不提供任何凭据的情况下检索机器人。 HTTPie 命令是

http :8000/robot/

输出

现在我们将创建一个超级用户并提供凭据来检索机器人。您可以按照如何在 Django 中创建超级用户?创建一个超级用户。

让我们尝试使用带有凭据的 HTTPie 命令来检索机器人。

输出

让我们尝试一个创建新机器人条目的 HTTPie 命令。

输出

注意:如果您在生产中使用 BasicAuthentication,则应确保您的 API 仅可用于 HTTPS 并始终重新请求凭据。如果您使用 mod_wsgi 部署到 Apache,则需要通过将 WSGIPassAuthorization 设置为“On”来显式配置 mod_wsgi 以将所需的标头传递给应用程序。