認證源碼分析 位置 : APIVIew 》dispatch方法 》self.initial(request, *args, **kwargs) >有認證,許可權,頻率三個版塊 分析: 只讀認證源碼: self.perform_authentication(request) 》 self.perform ...
認證源碼分析
位置 :
APIVIew----》dispatch方法---》self.initial(request, *args, **kwargs)---->有認證,許可權,頻率三個版塊
分析:
只讀認證源碼: self.perform_authentication(request)---》
self.perform_authentication(request)就一句話:request.user,需要去drf的Request對象中找user屬性(方法)---》
Request類中的user方法,剛開始來,沒有_user,走 self._authenticate()
核心:Request類的 _authenticate(self):
1.在需要進行認證的視圖類中添加(認證類是自己寫的類,該類繼承了BaseAuthentication):
2.此時apiview里的 authentication_classes就變成了自己第一步在視圖函數類里定義的了,而不會去自己的配置文件里找
3.然後正常執行到apiview里的dispatch方法:
4.dispatch方法內部又調用了initialize_request方法,返回了一個新的request對象
5.authenticators這個的值是get_authenticators()方法的返回值:返回值是一個個自己定義的繼承了BaseAuthentication類的認證類對象
6.Request類中的authenticators變成了自定義類的對象
7.在繼續走apiview里的dispatch方法里的initial方法
8.進入認證模塊的方法
9.進入新封裝request對象里
10.核心_authenticate方法
def _authenticate(self):
# self是Request對象,所以去Request對象里找authenticators,
# 最後self.authenticators的結果就是一個列表,列表裡面是一個個自定義認證類的對象
for authenticator in self.authenticators:
try:
# 此時authenticator就是認證類的對象,對象調用了authenticate方法,這個方法是需要我們在認證類里重新寫的
# 這個方法有兩個返回值
user_auth_tuple = authenticator.authenticate(self)
except exceptions.APIException:
self._not_authenticated()
raise
if user_auth_tuple is not None:
self._authenticator = authenticator
# 這兩個返回值給了Request對象,就是request.user和request.auth(這就是為什麼要求自己重新寫的authenticate方法要有兩個返回值了)
self.user, self.auth = user_auth_tuple
return
self._not_authenticated()