1. 程式人生 > 實用技巧 >Django - auth模組(認證系統)

Django - auth模組(認證系統)

Django - auth模組(認證系統)

前言

Django 預設已經提供了 認證系統 auth 模組。認證系統包含

  • 使用者管理
  • 許可權管理(RBAC)
  • 使用者組
  • 密碼雜湊系統
  • 一個可插拔的後臺管理系統(admin)

Django預設使用者的認證機制依賴Session機制,也就是說 不是前後端分離的專案 用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。

自動幫我們生成了資料模型類,也就是說我們可以借用他自定義好的資料模型。

也幫我們定義好了一些內建方法,直接操作我們好的資料模型類,AbstractUser

常用方法

  • 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

建立使用者模型的子應用

cd luffyapi/apps/
python ../../manage.py startapp users

在settings.py檔案中註冊子應用

INSTALLED_APPS = [
		...
  	'users',
]

自定義的使用者模型類

在users/models.py 下

注意⚠️:

django 認證系統中提供的使用者模型類及方法很方便,我們可以使用這個模型類,但是欄位無法瞞住我們的需求,如果我們專案中需要手機號,就需要新增額外的欄位。

Django提供了django.contrib.auth.models.AbstractUser使用者抽象模型類允許我們繼承,擴充套件欄位來使用Django認證系統的使用者模型類。

繼承AbstractUser

在建立好的應用models.py中定義使用者的使用者模型類。

class User(AbstractUser):
    """使用者模型類"""
    mobile = models.CharField(max_length=11, unique=True, verbose_name='手機號')

    class Meta:
        db_table = 'ly_users'
        verbose_name = '使用者'
        verbose_name_plural = verbose_name

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

在配置檔案(settings.py)中進行設定

AUTH_USER_MODEL = 'users.User'

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

注意⚠️:

Django建議我們對於AUTH_USER_MODEL引數的設定一定要在**第一次資料庫遷移之前就設定**好,否則後續使用可能出現未知錯誤

執行資料庫遷移

python manage.py makemigrations
python manage.py migrate

執行python manage.py migrate命令時:系統報錯類似如下:

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration reversion.0001_squashed_0004_auto_20160611_1202 is applied before its dependency users.0001_initial on database 'default'.

分析報錯:

這是表示有一個叫reversion的子應用使用了原來的廢棄的users模型reversion.0001_squashed_0004_auto_20160611_1202 is applied before its dependency, users.0001_initial on database 'default'.

但是目前資料庫已經設定了預設的子應用User,也就是在我們專案中第一次資料遷移的時候就已經生成了Auth模型資料

所以產生了衝突。那麼這種衝突,我們需要清除原來的遷移檔案和資料庫中的所有資訊就可以解決了

解決步驟

1.備份資料庫刪除原來的資料表資訊

備份資料庫,刪除關於使用者原來的資料表資訊和表結構[如果剛開始開發,則直接清除庫中所有資料表即可。]

備份資料庫

docker exec -it mysql-test  mysqldump -uroot -p123456 -t luffy > /Users/jiangchunsheng/Desktop/專案簡歷/LuffycityProject/luffycapi/logs/luffy_.sql

清除資料庫中所有表結構

mysql -N -s information_schema -e "SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') FROM TABLES WHERE TABLE_SCHEMA='eab12'" | mysql -f eab1

直接用pycharm 刪除也是可以的,方便還快捷。

2.刪除子應用users中migrations目錄下除了__init__.py以外的所有遷移檔案

3.刪除在django.contrib.admin和django.contrib.auth模組裡面的migrations遷移檔案,除了__init__.py

django.contrib.admin.migrations

![image-20200824143942365](/Users/jiangchunsheng/Library/Application Support/typora-user-images/image-20200824143942365.png)

django.contrib.auth.migrations

4.刪除在xadmin和reversion模組中的migrations的遷移檔案,除了__init__.py

5.執行資料遷移,把備份資料,除了使用者以外的全部恢復執行即可

python manage.py makemigrations
python manage.py migrate

6. 使用manage.py createsuperuser建立管理員即可

python manage.py createsuperuser