auth認證
導包
from django.contrib import auth
默認數據庫中使用auth_user表javascript
建立超級用戶
python manage.py createsuperuser
驗證登錄
auth.authenticate(request,username,password)
校驗用戶密碼和帳號,經過返回具體的用戶對象html
添加session,標識已登錄
auth.login(request,user)
接受request和前面經過登錄驗證的user對象,將session key保存在瀏覽器,數據保存在django_session表中。java
登錄驗證裝飾器
用來裝飾須要登錄後給瀏覽器添加session後才能訪問的視圖添加檢測,若是有session則放行,不然跳轉指定頁面,一般咱們設置成登錄頁面。python
#導入auth 登錄裝飾器
from django.contrib.auth.decorators import login_required
#在須要登錄後才能訪問的頁面視圖前面添加裝飾器
@login_required
def index():
pass
這樣瀏覽器在訪問index頁面時,會先檢查是否有session,若是沒有,則跳轉默認頁面,並將原訪問頁面做爲get參數放在跳轉頁面中,在登錄成功後會跳轉以前要訪問的頁面nginx
http://127.0.0.1:8000/accounts/login/?next=/index/
# 例如我要訪問index頁面,可是我沒session,
# 這時裝飾器會默認跳轉到/accounts/login/頁面,
# 並將index頁面的url以next參數的形式包含在其中
#,這樣在你登錄後,還能返回原頁面
能夠在django的settings中修改裝飾器默認跳轉的Urldocker
#配置auth認證登錄裝飾器的默認跳轉地址
LOGIN_URL = '/login/'
註銷方法
auth.logout(request)
接受一個request,清除當前request中的session並在數據表中django_session數據也會被清除。
經常使用方法,搭配一個視圖使用:數據庫
def logout(request):
auth.logout(request)
return redirect('/login/')
例如在頁面上使用a標籤和button按鈕點擊跳轉註銷視圖,註銷後跳回登錄頁面django
request.user屬性
auth組件的中間間中作了這樣一個事情,當request請求來時,判斷是否有session,若是有session則會根據session去django_session中找出相應的用戶的信息,並賦值給request.user屬性,也就是request.user=user是一個User數據對象,不然返回一個匿名的對象給request.user,該對象調用全部的方法都返回None瀏覽器
def index(request):
print(request.user)
# 是一個懶加載數據對象
這時咱們能夠把request.user看成一個普通的orm中的數據對象ruby
is_authenticated
判斷用戶對象是否經過了校驗
request.user.is_authenticated
# 返回一個布爾值
實例
from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
from django.contrib.auth.decorators import login_required
# Create your views here.
def login(request):
if request.method=='POST':
username = request.POST.get('username')
pwd = request.POST.get('password')
print(username,pwd)
#利用auth驗證用戶名和密碼是否正確驗證成功實例化一個數據對象不然返回none
user = auth.authenticate(request,username=username,password=pwd)
if user:
#登陸成功後,給登陸用戶在request中增長session,存在數據庫
auth.login(request,user)
return redirect('/index/')
else:
msg = '錯誤'
print('用戶名錯誤')
return redirect('/index/')
return render(request,'login.html')
def logout(request):
auth.logout(request)
return redirect('/login/')
@login_required()
def index(request):
print(request.session.__dir__)
print(request.user.password)
return render(request,'Index.html')
auth中user表的使用
由於auth中的用戶表存的密碼是密文形式,因此不能直接使用orm中creat語句
#導入user表
from django.contrib.auth.models import User
def register(request):
form_objs = UserInfoForm()
if request.method=='POST':
form_objs= UserInfoForm(request.POST)
if form_objs.is_valid():
username = form_objs.cleaned_data['name']
password = form_objs.cleaned_data['pwd']
#只能使用auth表的create_user方法去建立用戶
User.objects.create_user(username=username,password=password)
return redirect('/login/')
return render(request,'register.html',locals())
建立超級用戶的方法和上面同樣,只不過變成User.objects.create_superuser
校驗密碼和設置密碼
在用戶登錄成功後一般須要驗證密碼和修改密碼,auth組件也提供了相應的方法
# user爲User表具體的對象,接受一個密碼,返回布爾值
user.check_password(password)
# user爲User表具體的對象,接受一個密碼,修改原密碼,必定要記得save()保存
user.set_password(password)
user.save()
擴展auth_user自定義表
1. 建表繼承AbstractUser
from django.db import models
# Create your models here.
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
#編寫擴展字段,而後去settings告訴django auth組件會用這張表
phone =models.CharField(max_length=11)
2. 在django配置指定
AUTH_USER_MODEL = app01.UserInfo
#格式:app名稱.表名
總結
auth認證
默認Django內置的認證系統, 默認在數據庫中使用auth_user
from django.contrib import auth
1. 建立一個超級用戶
python manage.py createsuperuser
2. 驗證用戶名和密碼是否正確
user = auth.authenticate(request, username, password)
3. 登陸
auth.login(request, user) --> user是上一步的獲得的user對象
4. 註銷
auth.logout(request) --> 將當前請求的session數據刪除
5. 登陸認證的裝飾器
auth.decorators.login_required
默認跳轉的登陸url: /accounts/login/
在settings.py中 配置 LOGIN_URL = "你的登陸url"
6. is_authenticated()
判斷當前request.user是否通過認證,通過認證就返回True,不然是False
7. AuthenticationMiddleware中間件究竟作了什麼?
request.user = user, 匿名用戶對象
auth_user表的方法
8. create_user()
建立用戶,不一樣與普通orm目的是使密碼加密保存
9. create_superuser()
建立超級用戶
10. check_password()
檢查密碼
11. set_password()
設置密碼
使用流程:
- 登錄時校驗用戶密碼 auth.authenticate(username,password)生成user對象
- 給經過校驗的user對象添加session, auth.login(request,user)
- 添加session成功後,後續的請求,request.user=user對象,可拿到數據庫數據
- 註銷,auth.logout(request),將瀏覽器保存的sessionkey清除掉
- user表的建立用戶,不一樣於普通orm操做,由於密碼須要加密保存,User.objects.create_user(), User.objects.create_superuser().
- user對象的方法:user.check_password(password),user.set_password(passord)
- 判斷用戶是否經過校驗,request.user.is_authenticated(),返回一個布爾值(不經常使用)