auth模塊
一、什么是author模塊
Auth模塊是Django自帶的用戶認證模塊,可以實現包括用戶注冊、用戶登錄、用戶認證、注銷、修改密碼等功能。默認使用 auth_user 表來存儲用戶數據。
二、auth模塊的使用
1、創建超級用戶(create_superuser())
創建超級用戶就是在auth_user表中插入數據,密碼是加密的,因此不能手動在數據庫中插入數據
(1)用命令創建
python3 manage.py createsuperuser
(2)用Python代碼創建
from django.contrib.auth.models import User
user = User.objects.create_superuser(username='用戶名',password='密碼',email='郵箱',...)
2、驗證用戶(authenticate())
驗證用戶名以及密碼是否正確,一般需要username 、password兩個關鍵字參數。如果認證成功(用戶名和密碼正確有效),便會返回一個 User 對象
from django.contrib import auth
user = auth.authenticate(request, username=name, password=pwd)
相當於是在數據庫中查詢:
user=models.User.objects.filter(name=name,pwd=pwd).first()
3、登錄用戶(login())
該函數接受一個HttpRequest對象,以及一個經過認證的User對象。
該函數實現一個用戶登錄的功能。它本質上會在后端為該用戶生成相關session數據。
user = auth.authenticate(username=username, password=password)
if user is not None:
login(request, user)
return HttpResponse('登錄成功')
4、登錄成功
一旦登錄成功,調了這個函數login(request,user),在以后的視圖類(函數)中的request中就會有一個user對象,就是當前已登錄的用戶對象。
5、注銷(logout())
該函數接受一個HttpRequest對象,無返回值。
當調用該函數時,當前請求的session信息會全部清除,即調用request.session.flush()。該用戶即使沒有登錄,使用該函數也不會報錯。
auth.logout(request)
6、登錄認證裝飾器
快捷的給某個視圖添加登錄校驗。
若用戶沒有登錄,則會跳轉到django默認的 登錄URL '/accounts/login/ ' 並傳遞當前訪問url的絕對路徑 (登陸成功后,會重定向到該路徑)。
如果需要自定義登錄的URL,則需要在settings.py文件中通過LOGIN_URL進行修改。
from django.contrib.auth.decorators import login_required
@login_required(redirect_field_name='eee',login_url='/login/')
# redirect_field_name:修改?后面的key值,一般不回去修改
# login_url:如果沒有登錄,跳轉到的頁面
# login_url局部配置
@login_required(login_url='/login/')
# login_url全局配置
# 在setting文件中配置
LOGIN_URL='/login/'
直接使用 @login_required
7、創建普通用戶(create_user())
from django.contrib.auth.models import User
user = User.objects.create_user(username='用戶名',password='密碼',email='郵箱',...)
8、校驗密碼(check_password())
# 先拿到用戶(可以是登錄用戶,可以現查)
user = request.user
# 或者
user = authenticate(username=username, password=password)
pwd = request.POST.get('pwd')
ret = user.check_password(pwd)
9、修改密碼(set_password())
注意:設置完一定要調用用戶對象的save方法!!!
修改密碼時,可以先校驗原密碼輸入是否正確,原密碼正確再開始修改密碼
user.set_password(pwd)
user.save()
10、is_authenticated()
用來判斷當前請求是否通過了認證。如果通過驗證,是true,反之false
ret = request.user.is_authenticated()
11、刪除用戶
刪除用戶和用orm在表中刪除數據一樣
12、User對象的其他屬性
# 在網站上線以前,將is_active和is_staff設置為False
is_active # 禁止登錄網站(用戶還存在,封號)
is_staff # 是否對網站有管理權限(能不能登錄admin)
request.user.is_active = False
request.user.is_staff = False
三、擴展默認的auth_user表
1、方法一:定義一個表模型,跟User一對一關聯
from django.contrib.auth.models import User
class UserDetail(models.Model):
phone=models.CharField(max_length=32)
# 一對一跟auth_user表做關聯
# 如果是從外部引入的表模型,是不能加引號的
# 如果加引號,只是在當前model找
user=models.OneToOneField(to=User)
2、方法二:定義一個表模型,繼承(AbstractUser)
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
# username,password...都繼承了
phone=models.CharField(max_length=32)
sex=models.BooleanField()
注意:
-
一旦我們通過繼承來實現擴展auth_user表,那么做數據庫遷移,以后就沒有auth_user這個表了,以后認證組件用的表就是UserInfo。原來使用 auth_user 表模型的地方全部要用新的表模型——UserInfo
-
引用Django自帶的User表,繼承使用時需要設置,在setting中對新表進行配置:
AUTH_USER_MODEL ='app01.UserInfo'