分為兩步實現(xiàn)
-
第一步嗓违,創(chuàng)建自己的認(rèn)證類
Authentication
,
需要實現(xiàn)兩個方法:
from rest_framework import exceptions
from rest_framework import authentication
class MyAuthentication(authentication.BaseAuthentication):
"""創(chuàng)建自己的`認(rèn)證類`"""
def authenticate(self,request):
"""返回結(jié)果只能有`三種`
1.認(rèn)證失敗,拋異常 -> raise exceptions.AuthenticationFailed
2.認(rèn)證成功,返回元組(`用戶信息`缨硝,`token令牌信息`),
rest framework 會將這兩個信息賦值給`request`對象狐史,以便下一步使用。
用戶信息只能有一個典徘,一旦認(rèn)證成功蟀苛,則不再對下一個`認(rèn)證對象`進(jìn)行認(rèn)證
3.既不拋異常,也沒有返回值(或者返回`None`)逮诲,則繼續(xù)下一個`認(rèn)證`
如果最終都沒有返回元組(`用戶信息`帜平,`token令牌信息`),則使用配置的默認(rèn)用戶信息:`匿名用戶`
"""
pass
def authenticate_header(self,requet):
pass
-
第二步,將認(rèn)證類進(jìn)行
配置
梅鹦,這里又分兩種方式- 1)在
MyView
視圖類中裆甩,將認(rèn)證類Authentication
,添加進(jìn)authentication_classes
列表中,表示該認(rèn)證類只對當(dāng)前視圖類起作用齐唆。
- 1)在
class MyView(APIView):
authentication_classes = ['MyAuthentication',......]
def get(request, *args, **kwargs):
pass
- 2)在
Django
的settings.py
進(jìn)行全局配置
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ['api.utils.auth.Authtication',]
}
這里的局部配置優(yōu)先于全局配置嗤栓,例如:
class MyView(APIView):
authentication_classes = [ ] # 覆蓋 APIView 的 authentication_classes 屬性
則當(dāng)前視圖類可繞過全局認(rèn)證
5.用戶認(rèn)證的源碼流程
1.MyView.as_view()
這里調(diào)用Django
的as_view()
生成view
,并對view
進(jìn)行csrf
豁免箍邮。
2.dispatch()
,rest framework重寫了dispatch()
茉帅;
1)執(zhí)行initialize_request(request, *args, **kwargs)
對request
進(jìn)行包裝,并執(zhí)行
get_authenticators()
,獲取認(rèn)證對象
2)執(zhí)行 initial(request, *args, **kwargs)
,在initial
中進(jìn)行認(rèn)證perform_authentication(request)
6. REST用戶認(rèn)證
配置匿名用戶以及token
# settings.py
REST_FRAMEWORK = {
# 這里 UNAUTHENTICATED_USER锭弊、UNAUTHENTICATED_TOKEN 應(yīng)是函數(shù)對象
# 默認(rèn)的匿名用戶堪澎,token為 UNAUTHENTICATED_USER(),UNAUTHENTICATED_TOKEN()
# None() 返回值仍然為None
'UNAUTHENTICATED_USER': None,
'UNAUTHENTICATED_TOKEN': None,
}