rest_framework之認證源碼剖析

若是咱們寫API有人能訪問,有人不能訪問,則須要些認證。 如何知道該用戶是否已登入?數據庫

若是用戶登入成功,則給用戶一個隨機字符串,去訪問另外一個頁面。  django

之前寫session的時候,都是把session寫cookie裏面。  後端

那如今咱們能夠把隨機字符串經過返回值的方式給用戶。  api

後端經過查看用戶的url判斷用戶有沒有token值且這個字符串是否正確也要判斷。有則已登入,能夠訪問;沒有則跳回登入頁面。  瀏覽器

用戶登入cookie

1.有些api須要用戶登入才能訪問,有些api不須要用戶登入就能訪問。session

models.pyapp

建立用戶函數

urls.pypost

views.py    用戶登入只有post請求

token用md5加密,並保存或更新到數據庫中。

 post請求,運行結果

 

 token就保存到數據庫了   須要從新檢查代碼

 token生成成功後,就將新的token返回給用戶。有異常則返回異常。API寫完了。

 

 運行結果

 認證

用戶全部訂單app01

1.訂單url

2. views.py訂單視圖

 

 3.運行結果:get請求

 

 4.這個訂單隻有登入成功的時候才能夠看

 

 運行結果

 rest_framework認證

5.這段代碼假設post請求也要認證,若是再複製一遍就會很冗餘。django已經幫咱們封裝好了,不用本身寫。

 6.自定義一個認證類,本身寫認證規則。

7.認證源碼

8.本身定義認證規則,認證失敗則返回一個異常。

 9.注意:必須再寫一個方法,不然還會報錯。  

引入該模塊, 加上該方法:先爲空。

查看該模塊源碼

 加上該方法:先爲空。

運行結果

 用戶信息app

1.假設用戶信息app也要認證,(登入後才能訪問) 

自定義的一個認證寫完了以後,app視圖加上就行了。

 2.若是有成千上萬個api都須要認證怎麼辦呢  

接下來全局認證:不須要每個視圖都本身加上以上代碼,全局配置settings.py。      

認證源碼流程圖:

APIView類
第一步class OrderView(APIView):點擊APIView
第二步def dispatch(self, request, *args, **kwargs):
找到self.initial(request, *args, **kwargs),點擊initial
第三步def initial(self, request, *args, **kwargs):
找到self.perform_authentication(request)(進行認證)
點擊perform_authentication
第四步def perform_authentication(self, request):
request.user

Request類
第五步同上def dispatch(self, request, *args, **kwargs):
找到request = self.initialize_request(request, *args, **kwargs)
點擊initialize_request
第六步def initialize_request(self, request, *args, **kwargs):
找到return Request,點擊Request
第七步class Request(object):
找到    @property    def user(self):(獲取認證對象,進行一步步認證)
找到return self._user   
第八步仍是@property    def user(self):裏面
找到self._authenticate()點擊_authenticate
第九步def _authenticate(self): (循環全部對象,執行認證方法)

Authtication自定義認證類(本身寫了認證方法,就用本身的)
第十步def authenticate(self, request):
報錯:(返回元祖(user對象,token對象))

class OrderView(APIView):或class AuthView(APIView):等訂單
第十一步執行各個訂單的def post:  或def get:等方法

 源碼配置

 1.dispatch

 2.封裝Request

3.for循環認證列表

4.默認去全局的配置文件讀

5.若是本身請求函數裏面設置了,就用本身的。沒設置就用配置文件的。

6.將認證寫在配置文件中,不用局部的。

 源碼:  api_settings表示去配置文件中讀。

讀REST_FRAMEWORK這個key

7.setting.py

8.將認證相關的東西都寫在一個文件中。再引入該文件

settings.py

views.py:視圖文件中只有視圖相關的類。

9.列表裏填你本身寫的認證類的路徑。   view.py裏的全部類都不用加了,默認用session全局的認證。

10.登入不須要認證信息。全局認證,個別不須要認證。  空列表就行

 11.運行結果:

 訂單接口:

登入接口:

訂單接口:

 接下來是匿名用戶登錄問題

 Request封裝直接到:

1.讀取全局認證配置

2.進行認證

3.initial > 實現認證self.perform_authentication(request)

4.user

5.獲取認證對象,進行下一步步的認證

往下走

6.若是是匿名用戶,默認叫什麼

setting.py

 views.py

urls.py

運行結果

 7.源碼設置默認用戶名:

 8.設置匿名用戶名

"UNAUTHENTICATED_USER":lambda :"匿名用戶"   若匿名函數沒有參數,直接返回字符串

url請求

運行結果:

9.setting.py:

內置認證

1.django內置的認證  引入BaseAuthentication

BaseAuthentication源碼:

2.BaseAuthentication 下有兩個方法。

3.推薦繼承BaseAuthentication。更規範。

接下來繼續走源碼:  BasicAuthentication  基於瀏覽器認證

1.往下走,複製源碼

settings.py

 運行結果

3.views.py: 引入BasicAuthentication

4.運行結果

5.看源碼

6.改源碼,先註釋一下2行代碼

 不註釋表示容許用戶爲匿名用戶。

7.運行結果:瀏覽器會對用戶名和密碼加密放到url上,而後發給服務端,進行驗證。

8.還原代碼

本章結束

相關文章
相關標籤/搜索