DJANGO的用戶認證系統
- 2020 年 3 月 17 日
- 筆記
Django自帶的用戶認證系統,為開發者提供了許多在用戶登陸登出方面的快捷開發命令。這篇博文為初學者講解如何使用django的用戶認證系統。 Django版本2.X
1.User模型
User模型是抽象的用戶,對應總的用戶表,可以用來配置頁面的訪問許可權,註冊用戶的配置文件等功能。Djang中對應的User類只有一個,「超級管理員」(superuser)或「普通用戶」(staff)是用戶類的屬性對象,而不是不同的類。 默認的用戶的主要屬性是: username,password,email,first_name,last_name等,具體的屬性請參考官方文檔。
2.創建用戶
創建一個新的用戶對象,實際上是實例化處一個User類的對象。通常你可以: 直接創建
from django.contrib.auth.models import User user = User() user.username=kevinguo user.first_name=kevin user.last_name=guo
用戶的密碼不能以明文的方式存儲在數據表中,所以應當對密碼進行加密運算set_password方法是對明文密碼進行加密。
user.set_password("new password") user.save
使用create_user方法 顯然,上述方法不夠簡便,django為我們提供了更加方便的方法直接創建一個新的用戶
from django.contrib.auth.models import User new_user = User.objects.create_user('kevinguo','[email protected]','mypassword')
通過上述程式碼,django相當於執行了我們第一步中的包含save操作的所有內容,這個新的用戶已經被保存在用戶表中了,如果我們想額外增加新的欄位,可以通過如下類似的操作。
user.first_name="kevin" user.last_name="guo" user.save()
3.創建超級管理員用戶
為安全起見,超級管理員用戶無法通過如上方法創建,django為我們提供的manage.py 工具包中的方法可以創建一個超級管理員用戶
python manage.py createsuperuser --username=kevinguo [email protected]
之後,你會被提示輸入兩次密碼,完成創建。如果你帶上參數,同時也被要求輸入這些。
4更改密碼
在shell中更改密碼
python manage.py changepassword *username*
在程式碼處修改,使用set_password()
user = User.objects.get(username="kevinguo") user.set_password('new password') user.save()
特別注意的是,如果用戶密碼更改後,該用戶的所有登陸狀態均失效。
5.用戶驗證authenticate
使用authenticate()來驗證用戶。它使用username和password作為參數進行驗證,對每個身份驗證後端(setting.py 中的 authentication backend)進行一一檢查,如果有一個認證後端返回一個user對象(class:django.contrib.auth.model User),則停止向下檢查。如果後端引發PermissionDenied錯誤,將返回None.下面在程式碼中進行舉例說明
from django.contrib.auth import authenticate user = authenticate(username="kevinguo",password="mypassword") if user: pass else: pass
6.用戶的登陸
如何將上述已經得到驗證的用戶添加到當前的會話(session)中?django,使用login()函數來完成。 下面的例子綜合了上方的authenticate方法和login方法,完整的展示了一個簡單的用戶認證登陸過程。簡便期間,使用視圖函數處理。
from django.contrib.auth import authenticate,login def login_view(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username,password=password) if user: login(request,user) #返回一個登陸成功的頁面 else: #返回一個錯誤頁面
7.用戶的登出logout()
如果已經通過login登錄的用戶想要登出,可以在視圖中使用django.contrib.auth.logout(),該函數不會返回任何值。
from django.contrib.auth import logout def logout_view(request): logout(request) #返回一個登出的成功頁面
你可以根據自己的需求在以上基礎上添加更為複雜的業務邏輯。