基本认证 – 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中创建超级用户来创建一个超级用户。
让我们试试HTTPie命令,用证书来检索机器人。
http -a "admin": "admin@123″ :8000/robot/
输出
让我们尝试一下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″
输出
注意:如果你在生产中使用BasicAuthentication,你应该确保你的API只适用于HTTPS,并且总是重新请求凭证。如果你使用mod_wsgi部署到Apache,你需要明确配置mod_wsgi,通过设置WSGIPassAuthorization为 “On”,将所需的头信息传递给应用程序。