目錄
一.認證系統
Django自帶一個使用者認證系統,用於處理使用者賬戶、群組、許可和基於cookie的使用者會話。
Django的認證系統主要包含:
1.使用者
2.許可
3.組
4.可配置的密碼雜湊系統
5.用於使用者登入或者限制訪問的表單和檢視工具
6.可插拔的後臺系統
二.使用者物件
使用者物件是Django認證系統的核心,需要匯入auth模組,該模組存在於django.contrib下
from django.contrib import auth
Django的認證框架只有一個使用者模型,就是User模型,它位於django.contrib.auth.models下.
使用者模型主要有下面幾個欄位:
- username
- password
- first_name
- last_name
1.建立使用者
from django.contrib.auth.models import User
user = User.objects.create_user(name=`yven`,password=`123456`)
user.last_name = `law`
user.save()
2.使用者認證
提供的使用者認證功能就是驗證使用者名稱以及密碼是否正確,如果認證成功,便返回一個User物件,authenticate()會在該User物件上設定一個屬性來標識後端已經認證了該使用者,且該資訊在後續的登入過程中是需要的
user = auth.authenticate(request,username=name,password=pwd)
相當於查詢:user=models.User.objects.filter(name=name,pwd=pwd).first()
3.使用者登入
該函式接收一個HttpRequest物件和一個User物件引數,該方法會把使用者的ID儲存在Django的session中,一旦登入成功,函式中的request物件中,就會有一個user物件,就是當前登入的使用者物件,如果沒有登入,request.user=AnonymousUser,匿名使用者
from django.contrib.auth import authenticate, login
def login(request):
name = request.POST.get(`name`)
pwd = request.POST.get(`pwd`)
user = authenticate(username=name,password=pwd)
if user:
login(request,user)
...
else:
...
4.登出使用者
from django.contrib.auth import logout
def logout(request):
logout(request)
5.判斷使用者是否登入
def my_view(request):
if not request.user.is_authenticated()
return redirect(`%s?next=%s` % (settings.LOGIN_URL,requst.path))
...
6.登入認證裝飾器
auth為我們提供了一個裝飾器工具,用來快捷的給某個檢視新增登入校驗
from django.contrib.auth.decorators import login_required
@login_required(login_url=`/login/`)
def order(request):
...
login_url:如果沒有登入,跳轉到的頁面,也可以通過全域性設定,在settings中配置LOGIN_URL=`/login/`
7.建立普通使用者和超級使用者
auth提供了建立新使用者的方法,也提供了建立超級使用者的方法,需要提供必要引數.
from django.contrib.auth.models import User
user = User.objects.create_user(username=`使用者名稱`,password=`密碼`..)
superuser = User.objects.create_superuser(username=`使用者名稱`,password=`密碼`..)
8.校驗密碼
auth提供一個檢查密碼是否正確的方法。正確返回true,錯誤false。
bool = request.user.check_password(`密碼)
9.修改密碼
auth提供了一個修改密碼的方法set_password,接收要設定新密碼作為引數,設定完一定要呼叫使用者物件的save()方法
request.user.set_password(password=`新密碼`)
user.save()
10.is_staff和is_active
is_staff:使用者是否擁有網站的管理許可權。
is_active:是否允許使用者登入,設定為False,可以在不刪除使用者的前提下禁止使用者登入。
三.擴充套件預設的auth_user表
雖然內建的認證系統很好用,但是auth_user表的欄位只有固定的幾個,實際的應用中需要的欄位更多,所以需要對預設的auth_user表進行擴充套件,第一時間想到的方法是新建另外一張表通過一對一和內建的auth_user表關聯,這樣的確可以滿足要求,但是其實可以更好,就是通過繼承內建的AbstractUser類,來定義一個自己的Model類。
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
phone = models.CharField(max_length=255)
address = models.CharField(max_length=255)
通過這種方法擴充套件內建的auth_user表之後,一定要在settings.py中告訴Django現在使用新定義的UserInfo表來做使用者認證。
AUTH_USER_MODEL = `app名.UserInfo`
一旦我們指定了新的認證系統所使用的表,我們就需要重新在資料庫中建立該表,而不能繼續使用原來預設的auth_user表了。