03,Django的認證系統——auth模組
阿新 • • 發佈:2019-01-03
Django的使用者認證
https://docs.djangoproject.com/en/2.0/topics/auth/default/ 官方文件關於使用者認證的介紹!我們在開發一個網站的時候,無可避免的需要設計實現網站的使用者系統。此時我們需要實現包括使用者註冊、使用者登入、使用者認證、登出、修改密碼等功能,這還真是個麻煩的事情呢。
Django作為一個完美主義者的終極框架,當然也會想到使用者的這些痛點。它內建了強大的使用者認證系統--auth,它預設使用 auth_user 表來儲存使用者資料。
Auth模組中提供了很多的方法,最常用到的方法做了如下幾個歸納
1、authenticate()
<wiz_code_mirror>
1
1
from django.contrib import auth
提供了使用者認證功能,即驗證使用者名稱以及密碼是否正確,一般需要username 、password兩個關鍵字引數。如果認證成功(使用者名稱和密碼正確有效),便會返回一個 User 物件。
驗證使用者名稱和密碼 <wiz_code_mirror> 1 1user = authenticate(username='theuser',password='thepassword')
2、auth.login(request, user)
將驗證過的使用者注入 request.user屬性 ,這樣模版裡面可以通過{{request.user}}來獲取到具體的使用者名稱 <wiz_code_mirror> 13 1from django.contrib.auth import authenticate, login
2
3
def my_view(request):
4
username = request.POST['username']
5
password = request.POST['password']
6
user = authenticate(username=username, password=password)
7
if user is not None:
8
login(request, user)
9
# Redirect to a success page.
10
...
11
else:
12
# Return an 'invalid login' error message.
13
...
3、logout(request)
用於登出該函式接受一個HttpRequest物件,無返回值。當呼叫該函式時,當前請求的session資訊會全部清除。該使用者即使沒有登入,使用該函式也不會報錯。
<wiz_code_mirror> 5 1from django.contrib.auth import logout
2
3
def logout_view(request):
4
logout(request)
5
# Redirect to a success page.
4、is_authenticated()
用來判斷當前請求是否通過了認證。 多用於前端頁面判斷使用者是否登入 <wiz_code_mirror> x 1{{ user.is_authenticated }} # 返回True / False
2
3
{% if user.is_authenticated %}
4
5
{% else %}
6
7
{% endif %}
<wiz_code_mirror>
3
1
def my_view(request):
2
if not request.user.is_authenticated():
3
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
5、check_password(password)
auth 提供的一個檢查密碼是否正確的方法,需要提供當前請求使用者的密碼。密碼正確返回True,否則返回False。
6、set_password(password)
auth 提供的一個修改密碼的方法,接收 要設定的新密碼 作為引數。注意:設定完一定要呼叫使用者物件的save方法!!!User物件屬性
1、is_staff : 使用者是否擁有網站的管理許可權.
2、is_active : 是否允許使用者登入, 設定為 False,可以在不刪除使用者的前提下禁止使用者登入。
拓展預設的auth_user表
這內建的認證系統這麼好用,但是auth_user表字段都是固定的那幾個,我在專案中沒法拿來直接使用啊!比如,我想要加一個儲存使用者手機號的欄位,怎麼辦?聰明的你可能會想到新建另外一張表然後通過一對一和內建的auth_user表關聯,這樣雖然能滿足要求但是有沒有更好的實現方式呢?
答案是當然有了。
我們可以通過繼承內建的 AbstractUser 類,來定義一個自己的Model類。
這樣既能根據專案需求靈活的設計使用者表,又能使用Django強大的認證系統了。
<wiz_code_mirror> 10 1from django.contrib.auth.models import AbstractUser
2
class UserInfo(AbstractUser):
3
"""
4
使用者資訊表
5
"""
6
nid = models.AutoField(primary_key=True)
7
phone = models.CharField(max_length=11, null=True, unique=True)
8
9
def __str__(self):
10
return self.username
settings.py
<wiz_code_mirror>
1
# 引用Django自帶的User表,繼承使用時需要設定
2
AUTH_USER_MODEL = "app名.UserInfo"