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
對象。當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
。
創建用戶模塊的子應用
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步中的數據,將數據導入就可以了,以后如果要修改用戶相關數據,不需要重復本次操作,直接數據遷移即可。