1. 程式人生 > >python測試開發django-42.auth模塊登陸認證

python測試開發django-42.auth模塊登陸認證

若有 無效 遷移 manage error 用戶賬號 當我 我們 eat

前言

在開發一個網站時,經常會用到用戶的註冊和登陸相關的賬號管理功能,auth模塊是Django提供的標準權限管理系統,可以提供用戶身份認證, 用戶組和權限管理。
像用戶註冊、用戶登錄、用戶認證、註銷、修改密碼等功能都不需要我們去開發,這些功能django已經早就設計好了。

auth模塊

當我們執行makemigrations和migrate數據庫遷移的時候,會自動新增一個auth_user表,用戶存放用戶賬號密碼等相關信息。
創建超級管理員用戶python manage.py createsuperuser的時候,會在表裏面寫入管理員的賬號、密碼、郵箱等相關信息,如下圖

技術分享圖片

這裏我的賬號是root,密碼是root,很顯然存在數據庫的密碼不是明文的,而是加密後的

認證authenticate()

前面註冊的root賬號是在auth_user表裏面,所以需導入對應的User表,這裏密碼不是明文的,有個專門的方法authenticate判斷是否登錄成功

from django.contrib.auth import authenticate

> python manage.py shell
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth import authenticate

# 輸入正確賬號,密碼,user返回root用戶對象
>>> user=authenticate(username='root',password='root')
>>> user
<User: root>

# 輸入錯誤的密碼,user返回為空
>>> user=authenticate(username='root',password='xxxx')
>>> user
>>>

authenticate認證用戶的密碼是否有效, 若有效則返回代表該用戶的user對象, 若無效則返回None

註冊create_user

註冊用戶可以直接使用create_user方法,非常方便,前面說過密碼是加密後的,這裏使用create_user方法新增用戶會自動加密存儲到數據庫了

> python manage.py shell
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth import authenticate

# 新增用戶test.密碼test
>>> user1=User.objects.create_user(username='test',password='test',email='[email protected]')
>>> user1.save()
>>>

save保存後,數據庫查看auth_user表新增成功

技術分享圖片

修改密碼set_password

當我們需要修改密碼的時候,可以用set_password方法,該方法不驗證用戶的身份,直接修改,一般在已經登陸的時候,修改密碼使用

> python manage.py shell
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth import authenticate
>>> user=authenticate(username='test',password='test')

# 設置新密碼
>>> user.set_password('123456')
>>> user.save()

# 修改成功後使用新密碼登陸
>>> user=authenticate(username='test',password='test')
>>> user.set_password('123456')

當密碼錯誤的時候,user返回為空,使用user.set_password(‘123456‘)會直接拋異常,所以修改密碼的時候,一般先判斷下

>>> user=authenticate(username='test',password='test')
# 密碼不對,user為空拋異常
>>> user.set_password('123456')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'set_password'

# 加判斷
>>> user=authenticate(username='test',password='test')
>>> user
>>> if user is not None:
...         user.set_password('123456')
...         user.save()
...
>>>

登陸login

用戶登陸功能,有給專門的login函數,它可以在session中添加SESSION_KEY

from django.contrib.auth import login

login(request, user)傳2個參數,request和user參數,這裏不需要傳密碼,需配合authenticate(username=username, password=password)先校驗賬號和密碼是否成功

login(request, user)

登陸之前還有個is_active判斷, is_active是判斷用戶是否可以用,當它為is_active的時候(True),用戶可以正常登陸,當is_active為0(False),用戶不可用,相當於拉入黑名單

from django.contrib.auth import login, authenticate

def login_view(request):
    ‘’‘session登陸'''
    user = authenticate(username='test', password='test')
    if user is not None:
        if user.is_active:
            login(request, user)

技術分享圖片

退出登陸

logout會清除request中的user信息, 並刷新session

from django.contrib.auth import logout

def logout_view(request):
    '''退出登陸'''
    logout(request)

python測試開發django-42.auth模塊登陸認證