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)   #返回一個登出的成功頁面

你可以根據自己的需求在以上基礎上添加更為複雜的業務邏輯。