原始碼分析:1)apiview的dispath(self, request, *args, **kwargs)
2)dispath方法內 self.initial(request, *args, **kwargs) 進入三大認證
# 認證元件:校驗使用者 - 遊客、合法使用者、非法使用者
# 非法使用者:代表校驗失敗,丟擲異常,返回403許可權異常結果
self.perform_authentication(request)
# 許可權元件:校驗使用者許可權 - 必須登入、所有使用者、登入讀寫遊客唯讀、自定義使用者角色
# 認證失敗:丟擲異常,返回403許可權異常結果
self.check_permissions(request)
# 頻率元件:限制檢視介面被訪問的頻率次數 - 限制的條件(ip、id、唯一鍵)、頻率週期時間(s、m、h)、頻率的次數(3/s)
# 沒有達到限次:正常訪問介面
# 達到限次:限制時間內不能訪問,限制時間達到後,可以重新訪問
self.check_throttles(request)
3) 認證元件
request類的 方法屬性 user 的get方法 => self._authenticate() 完成認證
認證的細則:
# 做認證
def _authenticate(self):
# 遍歷拿到乙個個認證器,進行認證
# self.authenticators配置的一堆認證類產生的認證類物件組成的 list
for authenticator in self.authenticators:
try:
# 認證器(物件)呼叫認證方法authenticate(認證類物件self, request請求物件)
# 返回值:登陸的使用者與認證的資訊組成的 tuple
# 該方法被try包裹,代表該方法會拋異常,拋異常就代表認證失敗
user_auth_tuple = authenticator.authenticate(self)
except exceptions.apiexception:
self._not_authenticated()
raise
# 返回值的處理
if user_auth_tuple is not none:
self._authenticator = authenticator
# 如何有返回值,就將 登陸使用者 與 登陸認證 分別儲存到 request.user、request.auth
self.user, self.auth = user_auth_tuple
return
# 如果返回值user_auth_tuple為空,代表認證通過,但是沒有 登陸使用者 與 登陸認證資訊,代表遊客
self._not_authenticated()
自定義認證類:步驟:1) 建立繼承baseauthentication的認證類
2) 重新authenticate(self, request)方法,自定義認證規則
3) 根據認證規則 確定遊客、非法使用者、合法使用者
規則:i.沒有認證資訊返回none(遊客)
ii.有認證資訊認證失敗拋異常(非法使用者)
iii.有認證資訊認證成功返回使用者與認證資訊元組(合法使用者)
4) 完全檢視類的全域性(settings檔案中)或區域性(確切的檢視類)配置
from rest_framework.authentication import
baseauthentication
from rest_framework.exceptions import
authenticationfailed
from . import
models
class
myauthentication(baseauthentication):
"""同前台請求頭拿認證資訊auth(獲取認證的字段要與前台約定)
沒有auth是遊客,返回none
有auth進行校驗
失敗是非法使用者,丟擲異常
成功是合法使用者,返回 (使用者, 認證資訊)
"""def
authenticate(self, request):
#前台在請求頭攜帶認證資訊,
#且預設規範用 authorization 字段攜帶認證資訊,
#後台固定在請求物件的meta欄位中 http_authorization 獲取
#處理遊客
if auth is
none:
return
none
#設定一下認證欄位小規則(兩段式):"auth 認證字串"
auth_list =auth.split()
#校驗合法還是非法使用者
ifnot (len(auth_list) == 2 and auth_list[0].lower() == '
auth'):
raise authenticationfailed('
認證資訊有誤,非法使用者')
#合法的使用者還需要從auth_list[1]中解析出來
#注:假設一種情況,資訊為abc.123.xyz,就可以解析出admin使用者;實際開發,該邏輯一定是校驗使用者的正常邏輯
if auth_list[1] != '
abc.123.xyz
': #
校驗失敗
raise authenticationfailed('
使用者校驗失敗,非法使用者')
user = models.user.objects.filter(username='
admin
').first()
ifnot
user:
raise authenticationfailed('
使用者資料有誤,非法使用者')
drf 認證元件
目錄區域性使用 全域性使用 原始碼分析 使用場景 有些介面在進行訪問時,需要確認使用者是否已經登入,比如 使用者需要購買物品時,在結賬的時候,就需要進行登入驗證的。一般使用者認證都是基於角色認證 使用者表關聯角色表,角色表關聯許可權表 五表機制 使用者表與角色表多對多 角色表與許可權表多對多 dja...
drf元件之jwt認證
全稱 json web token 解釋 加密字串的原始資料是json,後台產生,通過web傳輸給前台儲存 格式 三段式 頭.載荷.簽名 頭和載荷用的是base64可逆加密,簽名用md5不可逆加密 內容 頭 基礎資訊,也可以為空 加密方式 公司資訊 專案組資訊 載荷 核心資訊 使用者資訊 過期時間 ...
DRF登入認證元件
1.寫乙個登入認證類 類名隨意,類中的方法名固定 from rest framework import exceptions from rest framework.authentication import baseauthentication class auth baseauthenticat...