Django—Auth認證模塊

用戶認證——auth模塊

  在進行用戶登陸驗證的時候,若是是本身寫代碼,就必需要先查詢數據庫,看用戶輸入的用戶名是否存在於數據庫中;若是用戶存在於數據庫中,而後在驗證用戶輸入的密碼,這樣一來,本身就須要編寫大量的代碼。html

  事實上,Django已經提供了內置的用戶認證功能,在使用「python manage.py makemigrations」 和 「python manage.py migrate」 遷移完成數據庫以後,根據配置文件settings.py中的數據庫段生成的數據表中已經包含了6張進行認證的數據表,分別是:python

而要進行用戶認證的數據表示auth_user。算法

  要使用Django自帶的認證功能,首先導入auth模塊:數據庫

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')

 authenticate()

  提供了用戶認證,即驗證用戶名以及密碼是否正確,通常須要username,password 兩個關鍵字參數。django

  若是認證信息有效,會返回一個user對象。authenticate()會在User對象上設置一個屬性標識那種認證後端認證了該用戶,且該信息在後面的登陸過程當中是須要的。當咱們試圖登陸一個從數據庫中直接取出來不通過authenticate()的User對象會報錯的!後端

login()

此函數使用django的session框架給某個已認證的用戶附加上session id等信息。等同於request.session['name'] = 'zyl'session

auth判斷用戶是否登陸

def auth_index(request):
    print(request.user.is_authenticated())  # 判斷當前用戶是否已經登陸
    print(request.user,type(request.user))  # 獲取當前登陸用戶對象
    return HttpResponse('ok')

user對象的is_authenticated()

若是是真正的User對象,返回值爲True,用於檢查用戶是否已經經過了認證。經過認證並不意味着用戶認證擁有任何權限,甚至也不檢查該用戶是否處於激活狀態,這只是代表用戶成功的經過了認證。這個方法很重要,在後臺用request.user.is_authenticated()判斷用戶是否已經登陸,若是true則能夠向前臺展現request.user.name。app

logout(request)註銷用戶

def auth_logout(request):
    auth.logout(request)  # request.session.flush()
    return HttpResponse('ok')

該函數接受一個HttpRequest對象,無返回值。當調用該函數時,當前請求的session信息會所有清除。該用戶即便沒有登陸,使用該函數也不會報錯。框架

  雖然使用的logout()函數,可是其本質上仍是使用的是fulsh() 。函數

auth註冊用戶

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對象

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('密碼')

Django自定義 auth_user

導入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必須登陸才能訪問')
相關文章
相關標籤/搜索