Django認證系統同時處理認證和授權。簡單地講,認證驗證一個使用者是否它們聲稱的那個人,授權決定一個通過了認證的使用者被允許做什麼。這裡的詞語“認證”同時指代這兩項任務。
認證系統包含:
- 使用者
- 權限:二進制(是/否)标志訓示一個使用者是否可以做一個特定的任務。
- 組:對多個使用者運用标簽和權限的一種通用的方式。
- 一個可配置的密碼哈希系統
- 用于登入使用者或限制内容的表單和視圖
- 一個可插拔的背景系統
使用:
位于django.contrib.auth,配置在settings.py中的
INSTALLED_APPS = [
'django.contrib.auth', #包含認證架構的核心和預設的模型。
'django.contrib.contenttypes',] #是Django内容類型系統,它允許權限與你建立的模型關聯。
和
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',#管理請求之間的會話。
'django.contrib.auth.middleware.AuthenticationMiddleware',] #使用會話将使用者與請求關聯起來。
有了這些設定,運作manage.py migrate指令将為認證相關的模型建立必要的資料庫表并為你的應用中定義的任意模型建立權限
登入:
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
# Redirect to a success page.
else:
# Return a 'disabled account' error message
...
else:
# Return an 'invalid login' error message.
...
登出:
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# Redirect to a success page.
隻允許登入的使用者通路:
方法一:
from django.conf import settings
from django.shortcuts import redirect
def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
# ...
方法二:
login_required裝飾器
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
主要完成兩件事:
1、如果使用者沒有登入,則重定向到settings.LOGIN_URL(需要設定),并将目前通路的絕對路徑傳遞到查詢字元串中。例如:/accounts/login/?next=/polls/3/。
2、如果使用者已經登入,則正常執行視圖。視圖的代碼可以安全地假設使用者已經登入。
from django.contrib.auth.decorators import login_required
@login_required(login_url='/accounts/login/')
def my_view(request):
...
注意,如果你沒有指定login_url參數,你需要確定settings.LOGIN_URL與你的登入視圖正确關聯。例如,使用預設值,可以添加下面幾行到你的URLconf中:
from django.contrib.auth import views as auth_views
url(r'^accounts/login/$', auth_views.login),
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
@login_required(login_url='/accounts/login/')
def my_view(request):
return redirect(request.GET.get('next') or '/')