使用者認證
Django
內建一個 auth
模組,幫助使用者實現註冊、登入、登出以及修改密碼等功能,幫助開發者省去了很多功夫
用於認證的資料表
auth_user
- User是
auth
模組中維護使用者資訊的關係模式(繼承了models.Model
), 資料庫中該表被命名為auth_user
- User是
auth_group
auth_user_user_permissions
- User和Permission通過多對多欄位
user.user_permissions
關聯,在資料庫中由auth_user_user_permissions
資料表維護。
- User和Permission通過多對多欄位
auth_user_groups
- User物件中有一個名為
groups
的多對多欄位, 多對多關係由auth_user_groups
資料表維護。Group物件可以通過user_set
反向查詢使用者組中的使用者。
- User物件中有一個名為
auth_group_permissions
auth_permission
django.contrib.auth
模組
使用
要使用Django
自帶的認證功能,首先要匯入auth
模組
from django.contrib import auth
auth
提供的方法
-
authentioate()
提供了使用者認證,即驗證使用者名稱以及密碼是否正確,一般需要
username
和password
兩個關鍵字引數;如果通過認證,
authentioate()
函式會返回一個User
物件;authentioate()
函式會在User
物件上設定一個屬性標識,這個屬性標識經過資料庫驗證使用者名稱和密碼;當我們試圖登入一個從資料庫中直接取出來不經過
authentioate()
的User
物件時會報錯。 -
login(request)
接收一個
HttpRequest
物件,以及一個通過authentioate()
函式認證的User物件;實現使用者登入功能,會在後臺為登入使用者生成
session
資料;執行過
login()
方法的使用者物件,就能通過request.user
拿到當前登入的使用者物件,從而取出使用者的相關資訊,否則取得的將是一個匿名使用者物件AnonymounsUser Object
。 -
logout(request)
接收一個
HttpRequest
物件,無返回值;當呼叫函式時,當前請求的session資訊全部被清除;
即使當前使用者沒有登入,呼叫該函式也不會報錯。
-
login_required()
auth
模組提供的一個裝飾器工具,能夠便捷地為某個檢視新增登入校驗。若使用者沒有登入,則預設會跳轉到
accounts/login/
,並傳遞當前訪問url
絕對路徑。自定義跳轉路徑,只需在
settings.py
中新增:LOGIN_URL = '/login/'from django.contrib.auth.decorators import login_required @login_required def home(request): pass
User
物件的方法
-
is_authentioated()
檢查使用者是否已經通過了認證;
如果是通過
auth
函式返回的真實的User
物件,返回值則為True; -
create_superuser()
該方法用於建立一個超級使用者,接收
username、password
兩個必要引數。效果與執行python manage.py createsuperuser
等同。 -
create_user()
一般情況
create_superuser()
方法很少使用,最常使用的是create_user()
方法,它將會建立一個普通使用者,常應用於註冊檢視中。建立使用者所需欄位,應與
auth_user
資料表中欄位對應。 -
set_password[password]
該方法用於修改密碼,接收要新密碼作為引數,最後一定要執行
save()
方法儲存,否則無效。 -
check_password[password]
檢查登入使用者密碼是否正確,需要當前請求使用者的密碼;
密碼正確返回 True,否則返回 False。
User物件屬性
-
is_staff
判斷使用者是否擁有網站的管理許可權
-
is_active
判斷是否允許使用者登入。
設定為False時可以不用刪除使用者來禁止使用者登入。
auth
模組擴充
由於 auth
模板中 auth_user
資料表欄位是固定的,因此當我們使用 auth
模組,想要新增額外的欄位時,就需要對其進行擴充。
擴充的方法:
-
模型中新增一個表,與
auth_user
表一對一關聯 -
繼承內建的
AbstractUser
類:常用-
模型
models.py
中新建一個類,繼承自AbstractUser
:from django.contrib.auth.models import User, AbstractUser # 匯入 AbstractUser 類 class UserInfo(AbstractUser): """ 繼承 AbstractUser 新增欄位:phone、addr """ phone = models.CharField(max_length=11, verbose_name='手機號碼') addr = models.CharField(max_length=128, verbose_name='家庭地址')
-
配置
settings.py
新增的類繼承
AbstractUser
,擴充後將會覆蓋auth_user
表,因此需要配置settings
,使預設認證知道要使用哪種表認證。# settings.py # 在最後新增如下程式碼 AUTH_USER_MODEL = 'app名.新增的類名' AUTH_USER_MODEL = 'app.UserInfo' # 示例
-
遷徙資料表
python manage.py makemigrations python manage.py migrate
-
建立使用者
擴充
auth
模組後,使用的不再是原來auth_user
表,而是新表app.UserInfo
表,因此在建立使用者時應該注意。# 擴充之前 from django.contrib.auth.models import User user_obj = User.objects.create_user(username='lila', password='1234') # 擴充之後 from app.models import UserInfo user_obj = UserInfo.objects.create_user(username='lila', password='1234')
- 若已經遷徙了模型,擴充
auth
模組時,需要將migrations
資料夾下檔案(如:0001_initial.py
檔案刪除),否則會報ValueError: Related model u'app.model' cannot be resolved
。 - 若還沒有遷徙模型,那麼正常執行即可。
-