Login
网站首页 > 文章中心 > 其它

Django_Rest_Framework实现身份认证源码详解

作者:小编 更新时间:2023-09-11 13:47:15 浏览量:182人看过

我来详细讲解一下"Django Rest Framework实现身份认证源码详解"的完整攻略,下面我们将分为以下几个部分:

介绍Django Rest Framework身份认证的基本原理

详细讲解Django Rest Framework中使用基于Token的身份认证

详细讲解Django Rest Framework中使用基于Session的身份认证

1. Django Rest Framework身份认证的基本原理

Django_Rest_Framework实现身份认证源码详解-图1

在Django Rest Framework中实现身份认证,需要在视图函数中添加认证类,Django Rest Framework中提供基于Token和基于Session两种方式来实现身份认证.

在views.py中添加身份认证类的方法如下:

from rest_framework.authentication import TokenAuthentication

class ExampleView(APIView):
# your code here

上述代码中,我们导入了TokenAuthentication类,然后将ExampleView视图函数中的authentication_classes属性设置为[TokenAuthentication]即可使用基于Token的身份认证.

如果要使用基于Session的身份认证,只需将authentication_classes属性设置为[SessionAuthentication]即可.

2. Django Rest Framework中使用基于Token的身份认证

Django_Rest_Framework实现身份认证源码详解-图2

此时此刻呢大家和小编一起研究一下如何在Django Rest Framework中使用基于Token的身份验证.

在Django Rest Framework中生成Token有两种方式:使用rest_framework.authtoken库和使用Django自带的TokenAuthentication库.这里我们采用使用Django自带的TokenAuthentication库的方式来生成Token.

在使用基于Token的身份认证前,我们需要先给用户生成一个Token,生成Token的方法如下:

from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token

user = User.objects.get(username='username')
token = Token.objects.create(user=user)

在上面的代码中,我们首先通过User.objects.get()方法获取到某个用户,然后使用Token.objects.create()方法为该用户生成一个Token.生成的Token将保存在数据库中的authtoken_token表中,每个Token对应一条记录,记录中保存了Token的值和对应的用户.

我们已经生成了Token,此时此刻呢,我们需要在Django Rest Framework中配置Token认证.

from rest_framework.authentication import TokenAuthentication

class ExampleView(APIView):
    pass

在上面的代码中,我们导入TokenAuthentication类,并将认证方式设置为基于Token的认证,然后在视图函数ExampleView的get方法中就可以通过request.user来获取当前已经认证的用户.

headers = {'Authorization': 'Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b'}
response = requests.get('http://localhost:8000/api/endpoint/', headers=headers)

在上面的代码中,我们在请求头中添加了Authorization字段,并将Token值放入其中.在服务端中,Django Rest Framework会自动解析请求头中的Token并进行身份认证.

Django Rest Framework中提供的Token模型较为简单,如果我们需要在Token模型中添加一些自定义的字段,需要自定义Token模型.

自定义Token模型的方法如下:

首先,在models.py中创建一个自定义的Token模型,在Token模型中添加一些自定义的字段.

from django.contrib.auth.models import AbstractUser, User
from django.db import models
from rest_framework.authtoken.models import Token

class CustomToken(Token):
    verbose_name_plural = '自定义Token'

在上面的代码中,我们从rest_framework.authtoken.models import Token中导入原生的Token类,并自定义了一个CustomToken模型,在CustomToken模型中添加了一个created_time字段,并将user字段设置为外键.

然后,我们需要修改Django Rest Framework中的Token认证类,将它的token_model属性设置为我们自定义的Token模型.修改认证类的方法如下:

from rest_framework.authentication import TokenAuthentication
from myapp.models import CustomToken

class CustomTokenAuthentication(TokenAuthentication):
model = CustomToken

在上面的代码中,我们定义了一个自定义的Token认证类,将model属性设置为我们自定义的Token模型.

最后,在视图函数中使用我们自定义的Token认证类即可.

class ExampleView(APIView):
    pass

在上面的代码中,我们将ExampleView视图函数中的身份认证方式设置为基于自定义Token的认证方式.

③ Django Rest Framework中使用基于Session的身份认证

Django Rest Framework中的Session身份认证是一种通过使用浏览器的Cookie来实现的身份认证方式.

此时此刻呢大家和小编一起研究一下如何在Django Rest Framework中使用基于Session的身份认证.

在Django Rest Framework中使用Session身份认证的方式与使用Token身份认证稍有不同,我们需要先在Django中开启Session,并在Django Rest Framework中进行相关配置.

首先,需要在Django中配置Session,可以在settings.py中进行配置,代码如下:

SESSION_ENGINE = 'django.contrib.sessions.backends.db'       # session存储方式
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                       # 浏览器关闭时session是否过期
SESSION_COOKIE_HTTPONLY = True                                # session cookie只能通过HTTP请求来获取,JS无法获取
SESSION_COOKIE_SECURE = False                                 # 是否启用HTTPS安全传输协议

在上面代码中,我们使用Django自带的Session存储方式,设置Session在浏览器关闭时不过期,设置Session cookie只能通过HTTP请求来获取,设置Session cookie不启用HTTPS安全传输协议.

然后,在视图函数中添加Session认证:

from rest_framework.authentication import SessionAuthentication

class ExampleView(APIView):
    pass

在上面的代码中,我们导入了Django Rest Framework中的SessionAuthentication认证类,并将ExampleView视图函数中的身份认证方式设置为基于Session的认证方式.

import requests
from django.contrib.sessions.backends.base import SessionBase

session = SessionBase()
session['_auth_user_id'] = '1'   # 用户ID
session['_auth_user_backend'] = 'django.contrib.auth.backends.ModelBackend'

headers = {'Cookie': 'sessionid={}'.format(session.session_key)}
response = requests.get('http://localhost:8000/api/endpoint/', headers=headers)

在上面的代码中,我们首先导入了django.contrib.sessions.backends.base.SessionBase类,然后模拟Session认证,将用户ID和用户认证后端保存到Session中,最后在请求头中添加sessionid即可.

以上就是土嘎嘎小编为大家整理的Django_Rest_Framework实现身份认证源码详解相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章