Django自定義Auth模塊方式


Django默認提供了認證系統Auth模塊,認證的時候,會使用auth模塊里面給提供的表。認證系統包含:

  • 用戶管理
  • 權限
  • 用戶組
  • 密碼哈希系統
  • 用戶登錄或內容顯示的表單和視圖
  • 一個可插拔的后台系統 admin

Django默認用戶的認證機制依賴Session機制,在項目中將引入JWT認證機制,將用戶的身份憑據存放在Token中,然后對接Django的認證系統,幫助來實現:

  • 用戶的數據模型
  • 用戶密碼的加密與驗證
  • 用戶的權限系統

Django用戶模型類

Django認證系統中提供了用戶模型類User保存用戶的數據,默認的User包含以下常見的基本字段:

字段名 字段描述
username 必選。150個字符以內。 用戶名可能包含字母數字,_@+ .-個字符。
first_name 可選(blank=True)。 少於等於30個字符。
last_name 可選(blank=True)。 少於等於30個字符。
email 可選(blank=True)。 郵箱地址。
password 必選。 密碼的哈希加密串。 (Django 不保存原始密碼)。 原始密碼可以無限長而且可以包含任意字符。
groups Group 之間的多對多關系。
user_permissions Permission 之間的多對多關系。
is_staff 布爾值。 設置用戶是否可以訪問Admin 站點。
is_active 布爾值。 指示用戶的賬號是否激活。 它不是用來控制用戶是否能夠登錄,而是描述一種帳號的使用狀態。
is_superuser 是否是超級用戶。超級用戶具有所有權限。
last_login 用戶最后一次登錄的時間。
date_joined 賬戶創建的時間。 當賬號創建時,默認設置為當前的date/time。

上面缺少一些字段,所以后面會對它進行改造,比如說它里面沒有手機號字段,后面需要加上。

常用方法:
  • set_password(raw_password)

    設置用戶的密碼為給定的原始字符串,並負責密碼的。 不會保存User 對象。當Noneraw_password 時,密碼將設置為一個不可用的密碼。

  • check_password(raw_password)

    如果給定的raw_password是用戶的真實密碼,則返回True,可以在校驗用戶密碼時使用。

管理器方法:

管理器方法即可以通過User.objects. 進行調用的方法。

  • create_user(username, email=None, password=None, ***extra_fields*)

    創建、保存並返回一個User對象。

  • create_superuser(username, email, password, ***extra_fields*)

    create_user() 相同,但是設置is_staffis_superuserTrue

創建用戶模塊的子應用

python ../../manage.py startapp users

在settings.py文件中注冊子應用。

INSTALLED_APPS = [
		...
  	'users',
]

創建自定義的用戶模型類

Django認證系統中提供的用戶模型類及方法很方便,可以使用這個模型類,但是字段有些無法滿足項目需求,如本項目中需要保存用戶的手機號,需要給模型類添加額外的字段。

Django提供了django.contrib.auth.models.AbstractUser用戶抽象模型類允許我們繼承,擴展字段來使用Django認證系統的用戶模型類。

可以在apps中創建Django應用users,並在配置文件中注冊users應用。

在創建好的應用models.py中定義用戶的用戶模型類。目前是將所有用戶都放到一個表里面的,比如管理員,老師(上傳課程),客戶等等,以后通過用戶組進行用戶划分

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
    """用戶模型類"""
    mobile = models.CharField(max_length=15, unique=True, verbose_name='手機號碼')
    avatar = models.ImageField(upload_to='avatar',verbose_name='用戶頭像',null=True,blank=True)

    class Meta:
        db_table = 'ly_user'
        verbose_name = '用戶信息'
        verbose_name_plural = verbose_name

自定義的用戶模型類還不能直接被Django的認證系統所識別,需要在配置文件中告知Django認證系統使用自定義的模型類。

在配置文件中進行設置

#注冊自定義用戶模型,格式:“應用名.模型類名”
AUTH_USER_MODEL = 'users.User'

AUTH_USER_MODEL 參數的設置以點.來分隔,表示應用名.模型類名

注意:Django建議對於AUTH_USER_MODEL參數的設置一定要在第一次數據庫遷移之前就設置好,否則后續使用可能出現未知錯誤。

執行數據庫遷移

python manage.py makemigrations
python manage.py migrate

如果在第一次數據遷移以后,才設置AUTH_USER_MODEL自定義用戶模型,則會報錯。解決方案如下:

0. 先把現有的數據庫導出備份,然后清掉數據庫中所有的數據表。
1. 把開發者創建的所有子應用下面的migrations目錄下除了__init__.py以外的所有遷移文件,只要涉及到用戶的,一律刪除,並將django-migrations表中的數據全部刪除。
2. 把django.contrib.admin.migrations目錄下除了__init__.py以外的所有遷移文件,全部刪除。
3. 把django.contrib.auth.migrations目錄下除了__init__.py以外的所有遷移文件,全部刪除。
4. 把reversion.migrations目錄下除了__init__.py以外的所有遷移文件,全部刪除。這個不在django目錄里面,在site-packages里面,是xadmin安裝的時候帶的,它會記錄用戶信息,也需要刪除
5. 把xadmin.migrations目錄下除了__init__.py以外的所有遷移文件,全部刪除。
6. 刪除我們當前數據庫中的所有表
7. 接下來,執行數據遷移(makemigrations和migrate),回顧第0步中的數據,將數據導入就可以了,以后如果要修改用戶相關數據,不需要重復本次操作,直接數據遷移即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM