文章目录
- 简介
- 源码解析
- 认证方式
- Token
- 使用
- 缺陷
- session
- 欢迎关注,互相学习,共同进步~
简介
本文介绍的是 django rest_framework的认证方式.
Token、Session、RemoteUser、jwt等认证方式。前三种是框架自带的,而jwt需要安装第三方库djangorestframework-jwt
,然后使用。
源码解析
以下是认证源码认证流程.
- 通过路由匹配后首先进入到
ApiView.as_view
中. ApiView
继承Django的View
,然后调用View.as_view
- 在
View
中调用dispatch
方法,因为ApiView
实现dispatch
方法,所以调用的是ApiView.dispatch
而不是View.dispatch
. - 在
ApiView.dispatch
中将django.request
再次封装成框架的rest_framework.request
- 封装的过程中将配置的Authentication类注入到request中.
- 封装完request后,调用
ApiView.perform_authentication
开始认证 - 认证的过程是通过
request.user
,然后再调用request._authentication
进行循环遍历所有注入的Authentiation
类中authenticate
方法进行认证,认证成功则返回user
和auth
两个结果.
认证方式
可以自定义认证类,只需要继承BaseAuthentication
类,然后实现authenticate
方法即可,然后将该类注入到request
即可.
或者使用框架自带的认证类也可。
Token
是框架自带的认证方式之一.
使用
- 配置authtoken app
settings
INSTALLED_APPS = [
...
'rest_framework.authtoken']
然后使用python manage.py migrate
,会创建authtoken表,该表连接auth_user.表,每个用户都有对应一个token,用户每次访问带有该token,系统就能通过token得到当前user.
- 局部添加认证方式.
在TestView
添加TokenAuthentication
认证, 路由到TestView时,会调用该类中的authenticate
方法,通过token获取到user.
view.py
from rest_framework.authentication import TokenAuthentication
class TestView(APIView):
authentication_classes = (TokenAuthentication,)
def get(self, *args, **kwargs):
return HttpResponse(self.request.user)
- 全局添加认证方式
任何路由请求需要通过Token认证.
settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
]
}
缺陷
- Token验证是放在一张表中,即authtoken_token中,key没有失效时间,永久有效,一旦泄露,后果不可想象,安全性极差。
- 不利于分布式部署或多个系统使用一套验证,authtoken_token是放在某台服务器上的,如果分布式部署,将失效,或多个系统用一套验证,将必须复制该表到相应服务器上,麻烦费力。
鉴于以上缺陷,使用jwt更加优秀.
session
drf中session认证,是通过django SessionMiddleware
和AuthenticationMiddleware
中将user存储到request中,然后获取到的.
欢迎关注,互相学习,共同进步~
我的个人博客
我的微信公众号:编程黑洞