Django默認(rèn)用戶認(rèn)證系統(tǒng)
- Django自帶用戶認(rèn)證系統(tǒng)
- 它處理用戶賬號(hào)、組、權(quán)限以及基于cookie的用戶會(huì)話。
- 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)。
- 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)證的用戶被允許做什么。
- 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)

-
使用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)如下:
