基本认证 – Django REST框架

基本认证 – Django REST框架

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

Django REST框架的基本认证使用HTTP基本认证。它一般适合于测试。REST框架会尝试对Basic Authentication类进行认证,并将返回的值设置为request.user和request.auth。如果认证成功,BasicAuthentication会提供以下凭证。

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

如果不是,request.user的值将被设置为django.contrib.auth.models.AnonymousUser的一个实例,而request.auth将被设置为None。为了使用BasicAuthentication方案,我们需要将其设置为默认的认证方案。你可以在全局范围内设置它,也可以在每个视图的基础上设置认证方案。

全局设置认证方案

你可以通过使用DEFAULT_AUTHENTICATION_CLASSES设置来全局设置认证。

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

以每个视图为基础设置认证方案

在基于功能的视图和基于类的视图中,以每个视图为基础设置认证方案是不同的。

基于功能的视图

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

@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类,我们可以在基于类的视图中设置认证方案。示例代码如下。

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文件,添加以下代码。

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’。代码如下。

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 REST框架

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

让我们试试HTTPie命令,用证书来检索机器人。

http -a "admin": "admin@123″ :8000/robot/

输出

基本认证 - Django REST框架

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

http -a “admin”:”admin@123″ POST :8000/robot/ name=”SR-3iA” robot_category=”SCARA Robots” currency=”USD” price=25000 manufacturer=”Fanuc” manufacturing_date=”2020-05-10 00:00:00+00:00″

输出

基本认证 - Django REST框架

注意:如果你在生产中使用BasicAuthentication,你应该确保你的API只适用于HTTPS,并且总是重新请求凭证。如果你使用mod_wsgi部署到Apache,你需要明确配置mod_wsgi,通过设置WSGIPassAuthorization为 “On”,将所需的头信息传递给应用程序。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程