Django?Rest?Framework實現(xiàn)身份認證源碼詳解
一.Django框架
Django確實是一個很強大,用起來很爽的一個框架,在Rest Framework中已經(jīng)將身份認證全都封裝好了,用的時候直接導入authentication.py這個模塊就好了。這個模塊中5個認證類。但是我們在開發(fā)中很少用自帶的認證類,而是根據(jù)項目實際需要去自己實現(xiàn)認證類。下面是內(nèi)置的認證類
BaseAuthentication(object):所有的認證相關(guān)的類都繼承自這個類,我們寫的認證類也要繼承自這個認證類,類中面有兩個方法,authenticate(self,request):這個方法是我們開發(fā)中用的最多的,還有一個方法:authentication_header(self,request):這個方法主要是給瀏覽器返回響應頭的。
BasicAuthentication(BaseAuthentication):這個是基于瀏覽器實現(xiàn)的認證類。
SessionAuthentication(BaseAuthentication):使用Django的會話框架進行身份驗證。
TokenAuthentication(BaseAuthentication):簡單的基于令牌的身份驗證。客戶端應通過在“授權(quán)”中傳遞令牌密鑰進行身份驗證HTTP頭,前面加上字符串“Token”
RemoteUserAuthentication(BaseAuthentication):遠程用戶身份驗證。
二.身份認證的兩種實現(xiàn)方式:
1.第一種方式就是在views.py模塊中去創(chuàng)建一個認證類,這個認證類必須重寫authenticate()這個方法,這個方法必須返回一個元組,里面返回用戶和token值,然后在需要認證的類視圖中注冊上這個認證類:
authentication_classes = [AuthClass,],authentication_classes
名字也不能改,后面講源碼的時候會告訴大家為什么這么寫。這是第一種認證方式。
2.①:第二中方式是在settings中配置認證模塊,這種方式是全局身份認證。首先創(chuàng)建一個utils工具包,然后創(chuàng)建一個auth.py身份認證模塊。把認證類寫在這里面。這是開發(fā)中經(jīng)常使用的方式,這樣views.py中全是類視圖,把認證類放到認證模塊中,符合高內(nèi)聚,低耦合的編程思想,也方便后期管理維護。
②:然后將這個認證模塊注冊到settings.py中,這是全局認證,所有的類視圖都會進行身份認證。
③:用戶登錄的借口是不需要身份認證的,所以在用戶登錄接口中加上authentication_classes = [],這樣登錄接口就不會進行身份認證了。
三.身份認證源碼解析流程
1.首先當一個請求過來的時候,先走路由的as_view()方法,as_view()方法中調(diào)用了dispatch方法,rest framework 中的APIView(view)繼承自django中的view,然后重寫了dispatch()方法,于是走APIView中的dispatch()方法。
2.重寫的dispatch()對django的request進行了重新的封裝,調(diào)用了initizlize_request()方法對request進行封裝,我們進入initizlize_request()這個方法再看一下做了什么操作。
3.initializer_request()這個方法中調(diào)用了get_authenticators()得到認證對象的這個方法,我們再進入這個方法看一下做了什么。
4.進入get_authenticators()中發(fā)現(xiàn),這個方法中有一個列表生成器,用來實例化當前認證類,這就是為什么之前要在類視圖中注冊認證類必須要用這個名字的原因,因為源碼中規(guī)定了認證類讀取的名字。
所以,如果我們自己寫了認證類,他會在類視圖中找到我們的認證類并執(zhí)行返回,如果我們沒有寫認證類呢?會怎么執(zhí)行?我們繼續(xù)往下看,看看列表生成器中調(diào)中的authentication_classes這個屬性它是從哪獲得的。
5.我們發(fā)現(xiàn)authentication_classes默認是從settings中配置獲得的。所以這也是為啥可以把認證類配置在settings中的原因。
然后這就是initizlize_request()方法對request的認證封裝的執(zhí)行流程,封裝完后在dispatch()中繼續(xù)往下執(zhí)行,當前只是實例化認證類,并沒有執(zhí)行認證。然后我們接著看dispatch()下面認證的執(zhí)行流程
6.dispatch()調(diào)用initial(request, *args, **kwargs)這個方法進行認證,我們看下initial(request, *args, **kwargs)這個方法做了什么。
7.initial(request, *args, **kwargs)這個方法中又調(diào)用了三個方法:
perform_authentication(request):身份認證方法
check_permissions(request):權(quán)限驗證方法
check_throttles(request):節(jié)流方法
我們看下perform_authentication(request):身份認證方法都干了些什么。
8.perform_authentication(request):身份認證方法只調(diào)用了一個user方法,我們繼續(xù)看user這個方法。
9.user這個方法調(diào)用了_authenticate()這個方法,繼續(xù)往下看。
10.這次只終于到底了,_authenticate()方法中遍歷認證類的所有對象,執(zhí)行認證類的authenticate方法,這個就是我們寫的身份認證方法,這個方法要返回一個元組,我們看下authenticate方法。
11.authenticate()方法返回一個元組,元組中包含當前對象和token值,所以我們重寫authenticate()方法也要返回這個元組。這樣整個認證執(zhí)行流程就全結(jié)束了。
如果authenitcate()方法拋出異常,就被捕獲并執(zhí)行 self._not_authenticated(),認證不通過并直接返回,就不會走dispatch()下面反射機制找視圖函數(shù)方法了,反射機制上篇博客我詳細的說過了,這里就不說了,如果沒有拋出異常,繼續(xù)走dispatch()下面的代碼。
以上就是Django Rest Framework實現(xiàn)身份認證源碼詳解的詳細內(nèi)容,更多關(guān)于Django Rest Framework身份認證的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Pandas檢查dataFrame中的NaN實現(xiàn)
本文主要介紹了Pandas檢查dataFrame中的NaN實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01python multiprocessing多進程變量共享與加鎖的實現(xiàn)
這篇文章主要介紹了python multiprocessing多進程變量共享與加鎖的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-107個流行的Python強化學習算法及代碼實現(xiàn)詳解
目前流行的強化學習算法包括?Q-learning、SARSA、DDPG、A2C、PPO、DQN?和?TRPO。這些算法已被用于在游戲、機器人和決策制定等各種應用中,本文我們將對其做一個簡單的介紹,感興趣的可以學習一下2023-01-01python中如何使用xml.dom.minidom模塊讀取解析xml文件
xml.dom.minidom模塊應該是內(nèi)置模塊不用下載安裝,本文給大家介紹python中如何使用xml.dom.minidom模塊讀取解析xml文件,感興趣的朋友一起看看吧2023-10-10