django 自定義登入驗證邏輯

2021-09-11 15:07:08 字數 2888 閱讀 3617

本文的django view採用的是基於cbv的模式

django中的登入功能主要涉及到django.contrib.auth這個包,它提供了2個重要的函式:authenticate和login。

這個函式接受的乙個收集引數,但至少需要接受username和password這兩個關鍵引數,它完成以下的事情:

從setting中獲取authentication_backends的元組, 預設情況下是django.contrib.auth.backends.modelbackend.

遍歷這整個元組,然後呼叫每乙個backend的authenticate方法,而每個backend.authenticate會有乙個登陸邏輯(自定義後面會提及),如modelbackend.authenticate它拿傳過來的賬號密碼的與資料庫user model的username與password進行驗證。

如果backend.authenticate驗證通過,就會返回乙個user物件,然後auth.authenticate將不再進行遍歷,return user物件。如果返回none,就繼續呼叫下乙個backend.authenticate。如果全部都返回none,那麼驗證不通過。

login只會用在auth.authenticate返回乙個user的情況下,這個函式會接著做下面的事情:

生成乙個新的session_id 放到request.session中(這個session在返回時會被session的中介軟體進行處理,將session_id放入到cookie當中)

將這個user放到request.user中

講了那麼多,我們來看一下**:

class loginview(view):

def get(self, request):

pass

def post(self, request):

username = request.post.get('username', '')

password = request.post.get('password', '')

login_form = loginform(request.post)

if login_form.is_valid:

user = auth.authenticate(username=username, password=password)

if user is not none:

login(request, user)

# 如果登入成功,重定向要主頁

# user為none,說明賬號或密碼錯誤

return render(request, "login.html", )

else:

# 表單無效,返回login_form物件即可,在template呼叫login_form.errors這個字典去獲取相關的錯誤

return render(request, "login.html", )

複製**

顯然,如果單純使用modelbackend.authenticate的驗證邏輯是不能滿足我們的需求,我們登入的賬號可以是username,也可以是手機/郵箱等,這時候,我們可以進行乙個自定義的登入邏輯驗證。

首先在view中寫自己的backend,最好直接繼承modelbackend

過載authenticate方法,引數直接來自auth.authenticate,但因為驗證需要用到表單中的username和password,所以前面提到,auth.authenticate也至少去接受這兩個關鍵引數

用q方法可以在進行或操作,如果用','是使用與操作,由於資料庫中的password是加密的,不能直接使用password=password,django為我們提供了check_password方法進行驗證。

如果驗證通過需要返回user物件,否則返回none

在setting中配置

authentication_backends = (

'users.views.myuserbackend',

)複製**

from django.db.models import q

from django.contrib.auth.hashers import make_password

class myuserbackend(modelbackend):

""" 自定義使用者驗證

""" def authenticate(self, username=none, password=none, **kwargs):

try:

user = userprofile.objects.get(q(username=username) | q(email=username) | q(mobile=username))

if user.check_password(password):

return user

except exception as e:

return none

複製**

順便提及一下logout函式,由於django已經為我們提供好了退出的處理,使用起來十分簡單:

複製**logout函式主要完成:

將request.session清除

request.user = anonymoususer()將使用者設定與匿名使用者

django 自定義登入驗證邏輯

本文的django view採用的是基於cbv的模式 django中的登入功能主要涉及到django.contrib.auth這個包,它提供了2個重要的函式 authenticate和login。這個函式接受的乙個收集引數,但至少需要接受username和password這兩個關鍵引數,它完成以下的...

Django自定義登入驗證類

1.首先在views檢視函式內引入 from django.contrib.auth import authenticate from django.contrib.auth.backends import modelbackend q表示查詢條件 from django.db.models imp...

使用者登入 html 自定義登入邏輯 013

當 進 行 自 定 義 登 錄 邏 輯 時 需 要 用 到 之 前 講 解 的 userdetailsservice 和 passwordencoder。但是 spring security 要求 當 進行自定義登入邏輯時容器內必須有 passwordencoder 例項。所以不 能直接 new 物...