1. 程式人生 > >03,Django的認證系統——auth模組

03,Django的認證系統——auth模組

 

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           1
user = authenticate(username='theuser',password='thepassword')
   
    2、auth.login(request, user)
將驗證過的使用者注入 request.user屬性  ,這樣模版裡面可以通過{{request.user}}來獲取到具體的使用者名稱 <wiz_code_mirror>       13           1
from 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           1
from 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           1
from 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"