Django-便捷的用戶認(rèn)證系統(tǒng)

Django默認(rèn)用戶認(rèn)證系統(tǒng)

  1. Django自帶用戶認(rèn)證系統(tǒng)
  • 它處理用戶賬號(hào)、組、權(quán)限以及基于cookie的用戶會(huì)話。
  1. Django認(rèn)證系統(tǒng)位置
  • django.contrib.auth包含認(rèn)證框架的核心和默認(rèn)的模型。
  • django.contrib.contenttypes是Django內(nèi)容類型系統(tǒng),它允許權(quán)限與你創(chuàng)建的模型關(guān)聯(lián)。
  1. Django認(rèn)證系統(tǒng)同時(shí)處理認(rèn)證和授權(quán)
  • 認(rèn)證:驗(yàn)證一個(gè)用戶是否它聲稱的那個(gè)人,可用于賬號(hào)登錄。
  • 授權(quán):授權(quán)決定一個(gè)通過了認(rèn)證的用戶被允許做什么。
  1. Django認(rèn)證系統(tǒng)包含的內(nèi)容
  • 用戶:用戶模型類、用戶認(rèn)證。
  • 權(quán)限:標(biāo)識(shí)一個(gè)用戶是否可以做一個(gè)特定的任務(wù),MIS系統(tǒng)常 用到。
  • 組:對(duì)多個(gè)具有相同權(quán)限的用戶進(jìn)行統(tǒng)一管理,MIS系統(tǒng)常用到。
  • 密碼:一個(gè)可配置的密碼哈希系統(tǒng),設(shè)置密碼、密碼校驗(yàn)。

以上都是官方的介紹字段,比較枯燥,可先跳過。

它可以做什么?

1. 當(dāng)需要?jiǎng)?chuàng)建用戶注冊(cè)models時(shí),不再需要自己設(shè)計(jì)復(fù)雜表結(jié)構(gòu)

案例:以如下注冊(cè)頁面為例,我們需要的數(shù)據(jù)庫字段有用戶名、密碼、手機(jī)號(hào)


image.png
  • 使用Django自帶的用戶模型類,我們可以節(jié)省大量代碼,實(shí)際定義代碼如下:

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    
    class User(AbstractUser):
        mobile = models.CharField(max_length=11)
    
    
  • 在settings中添加行AUTH_USER_MODEL = '應(yīng)用名.模型類名'

    # 指定本項(xiàng)目用戶模型類
    AUTH_USER_MODEL = 'users.User'  # 應(yīng)用名稱.模型類名稱
    

這里只是繼承了AbstractUser類,并只自定義了一個(gè)手機(jī)號(hào)的字段,而其他字段都不需再定義和設(shè)計(jì),就完成了我們需要的模型。

  • 因?yàn)楦割怉bstractUser已經(jīng)包含了username、password、email、first_name、last_name、last_login、date_joined、is_active 、is_staff、is_superuse這些字段,無需再次定義。
  • username、password為必選字段,其余可選。
  • 手機(jī)號(hào)字段Django中沒有自帶,需要我們繼承AbstractUser并添加一條手機(jī)號(hào)字段即可。

2. 當(dāng)需要在數(shù)據(jù)庫中添加注冊(cè)用戶時(shí),不再需要自己操作數(shù)據(jù)庫語法
當(dāng)用戶通過注冊(cè)驗(yàn)證后,創(chuàng)建用戶對(duì)象只需執(zhí)行下行代碼:

user = User.objects.create_user(username=username, password=password, mobile=mobile)

3. 用戶登錄無需手動(dòng)與數(shù)據(jù)庫數(shù)據(jù)對(duì)比,無需對(duì)密碼執(zhí)行加密對(duì)比操作

from django.contrib.auth import authenticate
user = authenticate(username=username, password=password)

3.1 自定義authenticate方法實(shí)現(xiàn)多賬號(hào)登錄

實(shí)現(xiàn)能讓用使用注冊(cè)用戶名、手機(jī)號(hào)或者郵箱完成登錄驗(yàn)證:

在自定義工具目錄util中繼承ModelBackend類,重寫authenticate方法

from django.contrib.auth.backends import ModelBackend
import re
from users.models import User

class MeiduoModelBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            # get方法查詢到數(shù)據(jù)返回用戶對(duì)象,未查詢到則報(bào)錯(cuò)
            user = User.objects.get(username=username)
        except:
            try:
                user = User.objects.get(mobile=username)
            except:
                return None
        # 判斷密碼
        if user.check_password(password):
            return user
        else:
            return None

4. 保持用戶登錄狀態(tài)無需手動(dòng)創(chuàng)建session

from django.contrib.auth import login
login(request, user)

5.退出登錄操作自動(dòng)刪除session

from django.contrib.auth import logout
logout(request)

遷移用戶模型類

  • 用戶認(rèn)證系統(tǒng)中的用戶模型類,是通過全局配置項(xiàng)AUTH_USER_MODEL 決定的。
  • 如果遷移自定義用戶模型類,必須先配置 AUTH_USER_MODEL 。
  • 設(shè)置自定義模型類后,必須完成遷移.
    執(zhí)行遷移命令:
    python manage.py makemigrations
    python manage.py migrate
    

遷移后,mysql數(shù)據(jù)庫用戶表結(jié)構(gòu)如下:

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容