分为两步实现
-
第一步,创建自己的认证类
Authentication
,
需要实现两个方法:
from rest_framework import exceptions
from rest_framework import authentication
class MyAuthentication(authentication.BaseAuthentication):
"""创建自己的`认证类`"""
def authenticate(self,request):
"""返回结果只能有`三种`
1.认证失败,抛异常 -> raise exceptions.AuthenticationFailed
2.认证成功,返回元组(`用户信息`,`token令牌信息`),
rest framework 会将这两个信息赋值给`request`对象,以便下一步使用。
用户信息只能有一个,一旦认证成功,则不再对下一个`认证对象`进行认证
3.既不抛异常,也没有返回值(或者返回`None`),则继续下一个`认证`
如果最终都没有返回元组(`用户信息`,`token令牌信息`),则使用配置的默认用户信息:`匿名用户`
"""
pass
def authenticate_header(self,requet):
pass
-
第二步,将认证类进行
配置
,这里又分两种方式- 1)在
MyView
视图类中,将认证类Authentication
,添加进authentication_classes
列表中,表示该认证类只对当前视图类起作用。
- 1)在
class MyView(APIView):
authentication_classes = ['MyAuthentication',......]
def get(request, *args, **kwargs):
pass
- 2)在
Django
的settings.py
进行全局配置
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ['api.utils.auth.Authtication',]
}
这里的局部配置优先于全局配置,例如:
class MyView(APIView):
authentication_classes = [ ] # 覆盖 APIView 的 authentication_classes 属性
则当前视图类可绕过全局认证
5.用户认证的源码流程
1.MyView.as_view()
这里调用Django
的as_view()
生成view
,并对view
进行csrf
豁免。
2.dispatch()
,rest framework重写了dispatch()
;
1)执行initialize_request(request, *args, **kwargs)
对request
进行包装,并执行
get_authenticators()
,获取认证对象
2)执行 initial(request, *args, **kwargs)
,在initial
中进行认证perform_authentication(request)
6. REST用户认证
配置匿名用户以及token
# settings.py
REST_FRAMEWORK = {
# 这里 UNAUTHENTICATED_USER、UNAUTHENTICATED_TOKEN 应是函数对象
# 默认的匿名用户,token为 UNAUTHENTICATED_USER(),UNAUTHENTICATED_TOKEN()
# None() 返回值仍然为None
'UNAUTHENTICATED_USER': None,
'UNAUTHENTICATED_TOKEN': None,
}
网友评论