Django rest Framework(DRF)源码解析——认证
1. get_authenticators
"""
Instantiates and returns the list of authenticators that this view can use.
"""
返回此类能够使用的认证器类实例列表
在initial_reuqest方法里面会调用此方法,然后会返回所有的认证器类列表,读取的是自定义类里面的属性authentication_classes,没有则读取APIView里面的此属性,APIV里面默认读取全部配置DEFAULT_AUTHENTICATION_CLASSES,之后把配置的类读到后进行了实例化,然后返回赋值在新request里面的authenticators
启发:在读取属性authentication_classes时,我们可以使用自定义的认证类,在自定义视图类里面此属性用我们自己定义的认证类,在全局配置之中配置DEFAULT_AUTHENTICATION_CLASSES为我们自己的认证类位置,部分不用的在我们的视图类里面使authentication_classes=[]为空列表。或者我们不用自定义的认证类。全部配置都用系统的认证类,则可以在全部配置之中把DEFAULT_AUTHENTICATION_CLASSES的认证类位置用系统默认认证类的位置。部分不用的在我们的视图类里面使authentication_classes=[]为空列表
2.perform_authentication
"""
Perform authentication on the incoming request.
Note that if you override this and simply 'pass', then authentication will instead be performed lazily, the first time either `request.user` or `request.auth` is accessed.
"""
对传入请求执行验证,如果重写此方法并且简单只用一个pass重写,那么验证将会延迟执行,直到首次使用request.user或者是request.authorization此方法才会被调用。函数结果返回一个认证用户request.user。
此函数里面只有一行代码,request.user,惰性执行,只有调用这句话,此函数才执行后调用其它函数,把结果进行返回。系统设计故意这么做的,这样只有当真正需要才会执行,减轻系统压力。
3. _authenticate函数
"""
Attempt to authenticate the request using each authentication instance
in turn.
"""
这是Request类里面的方法,会使用每一个认证实例来对请求进行认证
上面函数调用request.data时会调用data函数里面的此方法,此方法会使用配置好的每一个authenticator认证器类,调用里面的认证方法authenticate,对于请求进行认证,认证成功返回一个元组, (user,auth)以供后续使用,很多时候都需要调用两个数据进行操作。
此函数执行有三种情况
第一是所有认证类认证未通过,返回的都是None,证明是匿名用户,默认user返回anonymoususer,token返回none
第二种是认证未通过抛异常
第三种是认证通过返回user和token
4. _not_authenticated函数
"""
Set authenticator, user & authtoken representing an unauthenticated request.Defaults are None, AnonymousUser & None.
"""
认证未通过或者是异常的走此函数_not_authenticated,为user和token设置默认值。
UNAUTHENTICATED_USER
UNAUTHENTICATED_TOKEN
默认系统中第一个配置为AnonymousUser
默认系统中第二个配置为None
若我们把第一个设置为空,则会被赋值为空
5.系统验证类
认证类里面都会有一个authenticate函数执行认证逻辑,还有一个authenticate_header函数
5.1BaseAuthentication类
"""
All authentication classes should extend BaseAuthentication.
"""
所有的认证类都得继承于此类
5.1.1 authenticate函数
"""
Authenticate the request and return a two-tuple of (user, token).
"""
执行验证逻辑,返回一个两个元素的元组
BaseAuthentication里面的authenticate函数必须被重写,否则抛异常
5.1.2 authenticate_header函数
"""
Return a string to be used as the value of the `WWW-Authenticate`
header in a `401 Unauthenticated` response, or `None` if the
authentication scheme should return `403 Permission Denied` responses.
"""
返回一个字符串,用来作为‘401 Unauthenticated’认证未通过响应WWW-Authenticate响应头的值
或者返回None,用来作为`403 Permission Denied`无权限的响应值
此函数类里面必须有
5.2 BasicAuthentication类
"""
HTTP Basic authentication against username/password.
"""
校验用户名密码是否正确。浏览器会对“basic(用户名:密码)” base6加密后放在请求头HTTP_AUTHORIZATION里面进行传输,然后后端从头里面拿来split()验证。