Django auth元件

Yven發表於2018-11-26

一.認證系統

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
  • email
  • 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表了。

相關文章