1. 程式人生 > 其它 >Django(61)認證元件原始碼分析

Django(61)認證元件原始碼分析

認證元件原始碼入口

APIView下的dispatch下的self.initial(request, *args, **kwargs),原始碼如下:

def initial(self, request, *args, **kwargs):
    """
    在呼叫方法處理程式之前執行任何需要發生的事情
    """
    # 獲取請求的字尾格式
    self.format_kwarg = self.get_format_suffix(**kwargs)

    # 確定使用哪種渲染器和媒體型別來渲染響應,並存儲
    neg = self.perform_content_negotiation(request)
    request.accepted_renderer, request.accepted_media_type = neg

    # 如果正在使用版本控制,則確定 API 版本。
    version, scheme = self.determine_version(request, *args, **kwargs)
    request.version, request.versioning_scheme = version, scheme

    # 3大認證,確保傳入請求被允許
    self.perform_authentication(request)
    self.check_permissions(request)
    self.check_throttles(request)

三大認證

認證元件

self.perform_authentication(request)

認證元件作用:校驗使用者 - 遊客合法使用者非法使用者

  • 遊客:代表校驗通過,直接進入下一步校驗(許可權校驗)
  • 合法使用者:代表校驗通過,將使用者儲存在request.user中,再進入下一步校驗(許可權校驗)
  • 非法使用者:代表校驗失敗,丟擲異常,返回403許可權異常結果

許可權元件

self.check_permissions(request)

許可權元件:校驗使用者許可權 - 必須登入所有使用者登入讀寫遊客只讀自定義使用者角色

  • 認證通過:可以進入下一步校驗(頻率認證)
  • 認證失敗:丟擲異常,返回403
    許可權異常結果

頻率元件

self.check_throttles(request)

頻率元件:限制檢視介面被訪問的頻率次數 - 限制的條件(IP、id、唯一鍵)頻率週期時間(s、m、h)頻率的次數(3/s)
沒有達到限次:正常訪問介面
達到限次:限制時間內不能訪問,限制時間達到後,可以重新訪問