1. 程式人生 > >Django中的登入認證

Django中的登入認證

Django中已經封裝好了後端的認證功能authenticate

1:Django REST framework JWT提供了登入簽發JWT的檢視,可以直接使用
驗證使用者名稱和密碼,驗證成功後,為使用者簽發JWT,前端將簽發的JWT儲存下來。

登入流程為:
查詢使用者資料,將查詢到的資料和使用者輸入的資料對比驗證
request.user===>當前登入的使用者
僅使用下面的程式碼即可實現登入和簽發token

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    url(r'^authorizations/$', obtain_jwt_token),
]

但是此檢視函式所返回的只有一個token值,當需要獲取到其他值,如user.id,username等值時,需要重寫jwt_response_payload_handler函式
2:新建一個py檔案重寫自定義返回值的函式

def jwt_response_payload_handler(token, user=None, request=None):
    """
    自定義jwt認證成功返回資料
    """
    return {
        'token': token,
        'user_id': user.id,
        'username': user.username
    }

然後修改專案的配置檔案

JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}

便可實現登入功能,此時可以返回給客戶端token值和id,顯示使用者名稱資訊

3:實現使用不同的註冊資訊進行登入,如使用手機號、郵箱 + 密碼登入。
主要的邏輯是接收到使用者輸入的登入資訊,使用正則表示式來判斷使用者是使用的那種註冊資訊登入的,然後根據註冊資訊查詢到使用者物件,返回使用者資訊,實現多種號碼都可登入的功能

檢視jwt檢視的原始碼發現,查詢驗證的工作是由authenticate()方法完成,這個方法是由django提供的。
修改Django認證系統的認證後端需要繼承django.contrib.auth.backends.ModelBackend,並重寫authenticate方法。

authenticate(self, request, username=None, password=None, **kwargs)方法的引數說明:

  • request 本次認證的請求物件
  • username 本次認證提供的使用者賬號
  • password 本次認證提供的密碼
    重寫authenticate方法,補充它的驗證功能,使其不僅僅可以使用使用者名稱登入
from django.contrib.auth.backends import ModelBackend

class MyAuthenticationBackends(ModelBackend):
    """根據username查詢 user物件, 在使用user物件的check_password對比密碼是否正確"""
    def authenticate(self, request, username=None, password=None, **kwargs):
        if re.match(r'^1[3-9]\d{9}$', username):
            user = User.objects.get(mobile=username)
        else:
            user = User.objects.get(username=username)
        if user.check_password(password):
            return user
        else:
            return None

再在配置檔案中告知django我們自定義的認證

AUTHENTICATION_BACKENDS = [
    'users.utils.UsernameMobileAuthBackend',
]

總結思路:
1.定義類
2.重寫authenticate方法
3.配置AUTHENTICATION_BACKENDS=[類]