drf 三大認證之 認證元件

2022-09-16 02:48:09 字數 3710 閱讀 8914

原始碼分析:

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...