在進行用戶登陸驗證的時候,若是是本身寫代碼,就必需要先查詢數據庫,看用戶輸入的用戶名是否存在於數據庫中;若是用戶存在於數據庫中,而後在驗證用戶輸入的密碼,這樣一來,本身就須要編寫大量的代碼。html
事實上,Django已經提供了內置的用戶認證功能,在使用「python manage.py makemigrations」 和 「python manage.py migrate」 遷移完成數據庫以後,根據配置文件settings.py中的數據庫段生成的數據表中已經包含了6張進行認證的數據表,分別是:python
而要進行用戶認證的數據表示auth_user。算法
要使用Django自帶的認證功能,首先導入auth模塊:數據庫
# auth主認證模塊 from django.contrib import auth # 對應數據庫,能夠建立添加記錄 from django.contrib.auth.models import User
from django.contrib import auth from django.contrib.auth.models import User def auth_login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # models.User.objects.filter(username=username,password=password).first() user_obj = auth.authenticate(request,username=username,password=password) if user_obj: # 記錄用戶狀態 # request.session['name'] = 'jason' auth.login(request,user_obj) # 一旦記錄了,能夠在任意的地方經過request.user獲取到當前登陸對象 return HttpResponse('ok') return render(request,'auth_login.html')
提供了用戶認證,即驗證用戶名以及密碼是否正確,通常須要username,password 兩個關鍵字參數。django
若是認證信息有效,會返回一個user對象。authenticate()會在User對象上設置一個屬性標識那種認證後端認證了該用戶,且該信息在後面的登陸過程當中是須要的。當咱們試圖登陸一個從數據庫中直接取出來不通過authenticate()的User對象會報錯的!後端
此函數使用django的session框架給某個已認證的用戶附加上session id等信息。等同於request.session['name'] = 'zyl'session
def auth_index(request): print(request.user.is_authenticated()) # 判斷當前用戶是否已經登陸 print(request.user,type(request.user)) # 獲取當前登陸用戶對象 return HttpResponse('ok')
若是是真正的User對象,返回值爲True,用於檢查用戶是否已經經過了認證。經過認證並不意味着用戶認證擁有任何權限,甚至也不檢查該用戶是否處於激活狀態,這只是代表用戶成功的經過了認證。這個方法很重要,在後臺用request.user.is_authenticated()判斷用戶是否已經登陸,若是true則能夠向前臺展現request.user.name。app
def auth_logout(request): auth.logout(request) # request.session.flush() return HttpResponse('ok')
該函數接受一個HttpRequest對象,無返回值。當調用該函數時,當前請求的session信息會所有清除。該用戶即便沒有登陸,使用該函數也不會報錯。框架
雖然使用的logout()函數,可是其本質上仍是使用的是fulsh() 。函數
def auth_register(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') user_obj = auth.authenticate(request,username=username) if user_obj: return HttpResponse('當前用戶已存在') # models.User.objects.create(username=username,password=password) # User.objects.create(username=username,password=password) # 不能再用create建立 # User.objects.create_user(username=username,password=password) # 建立普通用戶 User.objects.create_superuser(username=username,password=password,email='123@163.com') # 建立超級用戶 return render(request,'auth_register.html')
User對象屬性:username,password(必填項) password用哈希算法保存到數據庫。
django Auth模塊自帶User模型所包含字段
username:用戶名
email: 電子郵件
password:密碼
first_name:名
last_name:姓
is_active: 是否爲活躍用戶。默認是True
is_staff: 是否爲員工。默認是False
is_superuser: 是否爲管理員。默認是False
date_joined: 加入日期。系統自動生成。
def auth_password(request): print(request.user.password) is_res = request.user.check_password('zyl123456') # 校驗密碼是否一致 if is_res: request.user.set_password('666') # 設置新密碼 request.user.save() # 修改密碼必須save保存 否則無效 return HttpResponse('ok')
使用set_password() 來修改密碼,接受要設置的新密碼做爲參數。
用戶須要修改密碼的時候,首先讓他輸入原來的密碼,若是給定的字符串經過了密碼檢查,返回True
注意:設置完必定要調用用戶對象的save方法
使用check_password(passwd)來檢查密碼是否正確,密碼正確的話返回True,不然返回False。
ok = user.check_password('密碼')
導入AbstractUser
from django.contrib.auth.models import AbstractUser
建立類Userinfo並繼承 AbstractUser
class Userinfo(AbstractUser):
建立本身須要的Userinfo字段
class Userinfo(AbstractUser): phone = models.CharField(max_length=32) avatar = models.CharField(max_length=32)
在settings.py中重載 AUTH_USER_MODEL 方法
AUTH_USER_MODEL = 'app01.Userinfo'
注意:若是在migrate時候報錯,刪除數據庫的表,從新遷移。
報錯內容以下:
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency users.0001_initial on database 'default'.
爲何要用認證裝飾器呢?
在之後的代碼中,咱們確定須要不少認證登陸,若是驗證成功,則進入登陸頁面,若是驗證不成功,則返回到登陸頁面。那麼爲了不代碼的冗餘,咱們能夠寫一個裝飾器的東西,不過Django已經爲咱們準備好了,咱們只須要用就行。
驗證裝飾器:看那些頁面須要登陸才能訪問,若是沒有登陸跳轉設置的頁面去。
1,若是用戶尚未登陸,默認會跳轉到'/accounts/login/'。這個值能夠在settings文件中經過LOGIN_URL參數來設定。(後面還會自動加上你請求的url做爲登陸後跳轉的地址,如:/accounts/login/?next=/auth/index/ 登陸完成以後,會去請求)
若是不添加該行,則在未登錄狀態打開頁面的時候驗證是否登錄的裝飾器跳轉到/accounts/login/下面 # 第一張方法就是修改settings.py 中的 LOGIN_URL LOGIN_URL = "/login/"
# auth自動跳轉 LOGIN_URL = '/auth_login/' # 告訴django再也不使用默認的auth_user,而使用咱們本身定義的表
from django.contrib.auth.decorators import login_required # @login_required(login_url='/auth_login/') # 局部配置 @login_required def auth_home(request): return HttpResponse('home必須登陸才能訪問') @login_required def auth_xxx(request): return HttpResponse('xxx必須登陸才能訪問')