Auth模塊的使用 auth認證 創建超級用戶 python manage.py createsuperuser 姓名: 必須寫 郵箱:可以不寫 密碼:加密的(經可能記住)(如果忘記可以去資料庫里把加密的密碼替換到忘記的密碼中) 登入驗證 auth.authenticate(request,user ...
Auth模塊的使用
auth認證
創建超級用戶
python manage.py createsuperuser
姓名: 必須寫
郵箱:可以不寫
密碼:加密的(經可能記住)(如果忘記可以去資料庫里把加密的密碼替換到忘記的密碼中)
登入驗證
auth.authenticate(request,username,password)
user = auth.authenticate(username=username, password=pwd)
#校驗用戶姓名和密碼
自定義登入驗證
例:實現用戶名或郵箱登錄驗證。
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
class CustomBackend(ModelBackend): # 繼承ModelBackend類,重寫authenticate()方法
"""
自定義用戶驗證後端:支持用戶名或郵箱登錄。
"""
def authenticate(self, request, username=None, password=None, **kwargs): # 參數username實際是用戶輸入的登錄賬號
try:
user = UserProfile.objects.get(Q(username=username) | Q(email=username))
if user.check_password(password):
return user
except Exception as e:
return None
然後別忘了在settings.py中配置該驗證後端:
AUTHENTICATION_BACKENDS = ['yourfilepath.CustomBackend', ] # yourfilepath是該類的目錄
login(HttpRequest, user)
登錄驗證。該函數接受一個HttpRequest對象,以及一個認證了的User對象。
此函數使用django的session框架給某個已認證的用戶附加上session id等信息。
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
# Redirect to a success page.
...
else:
# Return an 'invalid login' error message.
...
logout(request)
登錄註銷用戶。
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# 調用auth內置的註銷方法
二、User對象
User對象屬性:username,password(必填項)password用哈希演算法保存到資料庫
is_staff : 用戶是否擁有網站的管理許可權
is_active : 是否允許用戶登錄, 設置為"False",可以不用刪除用戶來禁止用戶登錄
is_authenticated()
如果是真正的 User 對象,返回值恆為 True 。 用於檢查用戶是否已經通過了認證。
通過認證並不意味著用戶擁有任何許可權,這個方法甚至也不檢查該用戶是否處於激活狀態,只是表明用戶成功的通過了認證。
這個方法很重要, 在後臺用request.user.is_authenticated()判斷用戶是否已經登錄,如果true則可以向前臺展示request.user.name。
場景:
- 用戶登陸後才能訪問某些頁面,
- 如果用戶沒有登錄就訪問該頁面的話直接跳到登錄頁面
- 用戶在跳轉的登陸界面中完成登陸後,自動訪問跳轉到之前訪問的地址
方法1:
def my_view(request):
if request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
方法2:
django已經為我們設計好了一個用於此種情況的裝飾器:login_requierd(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None)
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
創建用戶
使用 create_user 輔助函數創建用戶(這個是普通用戶):
from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')
create_superuser:超級用戶
from django.contrib.auth.models import User
user = User.objects.create_superuser(username='',password='',email='')
密碼檢查
check_password(password)
用戶需要修改密碼的時候,首先要讓其輸入原來的密碼 ,如果給定的值通過了密碼檢查,返回 True (通過明文密碼校驗密碼是否正確)
修改密碼
使用 auth.hashers.make_password(password) 來修改密碼
user = User.objects.get(username='')
user.password = auth.hashers.make_password(password='123') # 修改密碼,auth模塊自動將明文轉成密文
user.save() # 修改密碼一定要保存
修改密碼簡單示例
from django.contrib.auth import hashers
@login_required
def set_password(request):
user = request.user
err_msg = ''
if request.method == 'POST':
old_password = request.POST.get('old_password', '')
new_password = request.POST.get('new_password', '')
repeat_password = request.POST.get('repeat_password', '')
# 檢查舊密碼是否正確
if user.check_password(old_password):
if not new_password:
err_msg = '新密碼不能為空'
elif new_password != repeat_password:
err_msg = '兩次密碼不一致'
else:
user.password = hashers.make_password(new_password)
user.save()
return redirect("/login/")
else:
err_msg = '原密碼輸入錯誤'
content = {
'err_msg': err_msg,
}
return render(request, 'set_password.html', content)
三、認證進階:自定義auth User模型
這內置的auth_user表這麼好用,但是我在項目中沒法直接使用啊!比如,我想要加一個存儲用戶手機號的欄位,怎麼辦?
聰明的你可能會想到新建另外一張表然後通過一對一和內置的auth_user表關聯,這樣雖然能滿足要求但是有沒有更好的實現方式呢?
答案是當然有了。
我們可以通過繼承內置的auth_user表的對應的類,來定義一個自己的ORM類:
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser): # 繼承AbstractUser類
"""
用戶信息表
"""
nid = models.AutoField(primary_key=True)
phone = models.CharField(max_length=11, null=True, unique=True)
def __str__(self):
return self.username
註意!!!
按上面的方式擴展了內置的auth_user表之後,一定要在settings.py中告訴Django,我現在使用我新定義的UserInfo表來做用戶認證。寫法如下:
# 引用Django自帶的User表,繼承使用時需要設置
AUTH_USER_MODEL = "app名.UserInfo"
補充
# auth模塊的密碼加密--同樣的密碼--》再次加密--》密文也不一樣
# 如何實現?
pbkdf2_sha256$ # 加密方式
260000$ #過期時間
H93ubuUFw6FbYc6B8ojzKA$ # 隨機串,,秘鑰
H0ZnaiJOm/pI4K802Y2TcO5SQ7iWDcx5E+mb/hdABd8= #明文加密後的
# 後期如果你自己寫了User表,但是想用人家的密碼加密,就可以使用
-res=make_password('123456')
-check_password(明文,密文)