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
物件。當None
為raw_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_staff
和is_superuser
為True
。
建立使用者模型的子應用
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