Django Auth元件
Auth元件
Author元件是Django自帶的認證系統,包括登入校驗,使用者資訊資料庫表,以及修改使用者許可權,使用者登出。給使用者增加sesion等一切認證功能
匯入auth模組
from django.contrib import auth
使用者資訊
在django專案建立開時,執行python manage.py migrations 和 python manage.py mirate 兩個命令後django會自動建立django本身需要的資料庫表和你自定義建立的資料庫表,而Auth元件中的auth_user表就是用來存放使用者資訊的表:
命令列建立使用者方法:
- 在命令列中執行python manage.py createsuperuser(必須在專案目錄下執行)
- 輸入要建立的使用者名稱
- 輸入郵箱可以為空
- 輸入兩次密碼以便確認
資料建立成功資料庫中可以看多了一條資料,就是你建立的資料資訊
Auth元件常用方法
1、auth.authenticate()
authenticate英文翻譯是鑑定校驗的意思,該方法是用來將前端傳過來的使用者賬號和密碼和資料庫中的資訊進行對比,校驗通過返回一個通過校驗的資料物件(通常叫做user)裡面包含很多資訊,否則返回None:
常見用法:user = auth.authenticate(username='', password='')
def login(request): if request.method=='POST': #獲取前端登入請求的使用者和密碼 name = request.POST.get('name') pwd = request.POST.get('pwd') #使用auth自帶的方法校驗賬號密碼 user = auth.authenticate(username=name, password=pwd)
2、auth.login(Httprequest,user)
該函式接受一個HttpRequest物件,以及一個經過認證的User物件。
該函式實現一個使用者登入的功能。它本質上會在後端為該使用者生成相關session資料,這樣這個使用者在登入後就可以直接訪問其要驗證使用者是否登入的頁面, 結合上面校驗使用者賬號密碼得到的物件
,用法:
def login(request): if request.method=='POST': #獲取登入請求的使用者和密碼 name = request.POST.get('name') pwd = request.POST.get('pwd') #使用auth自帶的方法校驗賬號密碼 user = auth.authenticate(username=name, password=pwd) if user: #使用auth.login方法加上sessioncookie auth.login(request,user) #這段程式碼看不懂先往下面看 # 如果校驗通過則進去下一個頁面,獲取不到則預設跳轉index的url nexturl = request.GET.get('next',reverse('index')) return redirect(nexturl)
3、logout(Httprequest)
該方法用來清除請求客戶端報存的session,這樣該客戶端就失去了訪問我需要驗證才能訪問頁面的資格,通常我們常見的登出按鈕就是這樣實現的。
步驟:
- 在前端頁面放置一個a標籤點選跳轉url觸發django的檢視函式。
- 在檢視函式中執行logout方法,本質是將客戶端的session給清除掉
- 清除session後通常我們重定向回登入頁面
def loginout(request):
#使用logout方法登出清除sessioncookie
auth.logout(request)
#返回login頁面
return redirect(reverse('login'))
4、is_authenticated()
該方法是判斷request請求中user屬性中是否被驗證,前面我們是對校驗通過(authenticate)的user加上session並將對應的key給request.user(login(request,user))。
用法:
def my_view(request):
#對訪問請求的user進行session檢查如果不通過則將當前訪問的目錄拼接到login地址,並重定向去login頁面
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
這樣我們可以在檢視函式裡面加上這樣的程式碼,這樣沒登入就無法通過校驗也就無法直接訪問頁面,必須是登入後的使用者才能進行訪問。這樣還是很麻煩並且重複程式碼多,所以auth還提供了專門的裝飾器方法給我們,原理就是和上面說的一樣。
5、login_requierd
auth 給我們提供的一個裝飾器工具,用來快捷的給某個檢視新增登入校驗。
用法:
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
若使用者沒有登入,則會跳轉到django預設的 登入URL '/accounts/login/ ' 並傳遞當前訪問url的絕對路徑 (登陸成功後,會重定向到該路徑)。
如果需要自定義登入的URL,則需要在django中的settings.py檔案中通過LOGIN_URL進行修改。
LOGIN_URL = '/login/' # 這裡配置成你專案登入頁面的路由
Auth元件針對user表的用法
現在大家都知道使用者的資訊是存在服務端的資料庫裡,也就是auth_user表,怎麼操作這張表,auth元件也提供了相應的方法我們。
create_user()
auth 提供的一個建立新使用者的方法,需要提供必要引數(username、password)等。
用法:
from django.contrib.auth.models import User
user = User.objects.create_user(username='使用者名稱',password='密碼',email='郵箱',...)
create_superuser()
auth 提供的一個建立新的超級使用者的方法,需要提供必要引數(username、password)等。
用法:
from django.contrib.auth.models import User
user_obj = User.objects.create_superuser(username='使用者名稱',password='密碼',email='郵箱',...)
check_password(raw_password)
auth 提供的一個檢查密碼是否正確的方法,需要提供當前請求使用者的密碼。
密碼正確返回True,否則返回False。
用法:
ok = user_obj.check_password('密碼')
或者直接針對當前請求的user物件校驗原密碼是否正確:
ok = request.user.check_password(raw_password='原密碼')
set_password(raw_password)
auth 提供的一個修改密碼的方法,接收 要設定的新密碼 作為引數。
==注意:設定完一定要呼叫使用者物件的save方法!!!==
用法:
user_obj.set_password('新密碼')
user_obj.save()
一個修改密碼功能的簡單示例
@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.set_password(new_password)
user.save()
return redirect("/login/")
else:
err_msg = '原密碼輸入錯誤'
content = {
'err_msg': err_msg,
}
return render(request, 'set_password.html', content)
使用者物件的屬性
user_obj能夠拿到認證所用使用者表的資料屬性,比如username, password等。
其他常用屬性含義如下:
is_staff : 使用者是否擁有網站的管理許可權.
is_active : 是否允許使用者登入, 設定為 False,可以在不刪除使用者的前提下禁止使用者登入。