本篇記錄一下自己對django鑒權的學習和理解
先上代碼
# Backend可以是普通的python類,但是關於登陸校驗需要具有以下規定的2個方法(登錄basic認證方式# BasicAuthentication之後的後端處理邏輯-理解為中間件也可以):
# authenticate(self,username=None,password=None) 或者authenticate(self,token=None),如果通過驗證,返回值是一個User對象,如果不通過驗證,返回值是None。
# get_user(self,user_id)
# 這兩類方法的具體使用不是很相同,關於登陸校驗的authenticate,Django在使用他們的時候,會遍歷所有的auth backends
# 一旦發現有一個backend校驗通過,即返回User對象,那麼將會停止下面backend的校驗,並且將校驗成功的backend綁定在該用戶上放入session中,
# 此後如果再次調用該方法,那麼將會使用session中的backend進行校驗,而不再遍歷所有backend了。
AUTHENTICATION_BACKENDS = ['util.auth_func.CustomBackend']
REST_FRAMEWORK = {
# api文檔
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',
# 配置默認的認證方式 base:賬號密碼驗證
# session:session_id認證
'DEFAULT_AUTHENTICATION_CLASSES': (
# drf的這一階段主要是做驗證,middleware的auth主要是設置session和user到request對象
# 默認的驗證是按照驗證列表從上到下的驗證(只需要通過一個即可)
# 判斷request中是否帶有JWT的自定義請求頭(token形式)
'rest_framework_simplejwt.authentication.JWTAuthentication',
# 判斷是否有session_id(cookie形式)
'rest_framework.authentication.SessionAuthentication',
# basic認證(用戶密碼登錄)
'rest_framework.authentication.BasicAuthentication',
)}
AUTHENTICATION_BACKENDS 登錄的時候會調用(有優先級)
DEFAULT_AUTHENTICATION_CLASSES
我這裡寫了三種校驗方式 但凡匹配到任意一種,無論是否成功,都不會繼續校驗了
第一級:rest_framework_simplejwt.authentication.JWTAuthentication
以postman為例,因為我的登錄校驗是優先jwt,所以我參數裡填token的形式 就只會 走 JWTAuthentication
第二級:rest_framework.authentication.SessionAuthentication --檢查request中是否帶有session_id
第三級:rest_framework.authentication.BasicAuthentication --basic認證,就是賬號密碼
這一期就寫這麼多 有時間再記錄。之前看到過一張時序圖 還挺好的 我貼在下面