06.Django-使用者認證

平仄平仄平平仄發表於2020-06-08

使用者認證

Django 內建一個 auth 模組,幫助使用者實現註冊、登入、登出以及修改密碼等功能,幫助開發者省去了很多功夫

用於認證的資料表

  • auth_user
    • User是auth模組中維護使用者資訊的關係模式(繼承了models.Model), 資料庫中該表被命名為auth_user
  • auth_group
  • auth_user_user_permissions
    • User和Permission通過多對多欄位user.user_permissions關聯,在資料庫中由auth_user_user_permissions資料表維護。
  • auth_user_groups
    • User物件中有一個名為groups的多對多欄位, 多對多關係由auth_user_groups資料表維護。Group物件可以通過user_set反向查詢使用者組中的使用者。
  • auth_group_permissions
  • auth_permission

django.contrib.auth模組

使用

要使用Django自帶的認證功能,首先要匯入auth模組

from django.contrib import auth

auth提供的方法

  • authentioate()

    提供了使用者認證,即驗證使用者名稱以及密碼是否正確,一般需要usernamepassword兩個關鍵字引數;

    如果通過認證,authentioate()函式會返回一個User物件;

    authentioate()函式會在User物件上設定一個屬性標識,這個屬性標識經過資料庫驗證使用者名稱和密碼;

    當我們試圖登入一個從資料庫中直接取出來不經過authentioate()User物件時會報錯。

  • login(request)

    接收一個HttpRequest物件,以及一個通過authentioate()函式認證的User物件;

    實現使用者登入功能,會在後臺為登入使用者生成 session 資料;

    執行過 login() 方法的使用者物件,就能通過request.user 拿到當前登入的使用者物件,從而取出使用者的相關資訊,否則取得的將是一個匿名使用者物件 AnonymounsUser Object

  • logout(request)

    接收一個HttpRequest物件,無返回值;

    當呼叫函式時,當前請求的session資訊全部被清除;

    即使當前使用者沒有登入,呼叫該函式也不會報錯。

  • login_required()

    auth模組提供的一個裝飾器工具,能夠便捷地為某個檢視新增登入校驗。

    若使用者沒有登入,則預設會跳轉到 accounts/login/,並傳遞當前訪問 url 絕對路徑。

    自定義跳轉路徑,只需在 settings.py 中新增:LOGIN_URL = '/login/'

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def home(request):
     pass
    

User物件的方法

  • is_authentioated()

    檢查使用者是否已經通過了認證;

    如果是通過auth函式返回的真實的User物件,返回值則為True;

  • create_superuser()

    該方法用於建立一個超級使用者,接收 username、password 兩個必要引數。效果與執行 python manage.py createsuperuser 等同。

  • create_user()

    一般情況 create_superuser() 方法很少使用,最常使用的是create_user() 方法,它將會建立一個普通使用者,常應用於註冊檢視中。

    建立使用者所需欄位,應與 auth_user 資料表中欄位對應。

  • set_password[password]

    該方法用於修改密碼,接收要新密碼作為引數,最後一定要執行 save() 方法儲存,否則無效。

  • check_password[password]

    檢查登入使用者密碼是否正確,需要當前請求使用者的密碼;

    密碼正確返回 True,否則返回 False。

User物件屬性

  • is_staff

    判斷使用者是否擁有網站的管理許可權

  • is_active

    判斷是否允許使用者登入。

    設定為False時可以不用刪除使用者來禁止使用者登入。

auth模組擴充

由於 auth 模板中 auth_user 資料表欄位是固定的,因此當我們使用 auth 模組,想要新增額外的欄位時,就需要對其進行擴充。

擴充的方法:

  1. 模型中新增一個表,與 auth_user 表一對一關聯

  2. 繼承內建的 AbstractUser 類:常用

    1. 模型 models.py 中新建一個類,繼承自 AbstractUser

      from django.contrib.auth.models import User, AbstractUser   # 匯入 AbstractUser 類
      
      class UserInfo(AbstractUser):
          """
          繼承 AbstractUser
          新增欄位:phone、addr
          """
          phone = models.CharField(max_length=11, verbose_name='手機號碼')
          addr = models.CharField(max_length=128, verbose_name='家庭地址')
      
    2. 配置 settings.py

      新增的類繼承 AbstractUser ,擴充後將會覆蓋 auth_user 表,因此需要配置 settings,使預設認證知道要使用哪種表認證。

      # settings.py
      # 在最後新增如下程式碼
      AUTH_USER_MODEL = 'app名.新增的類名'
      
      AUTH_USER_MODEL = 'app.UserInfo'    # 示例
      
    3. 遷徙資料表

      python manage.py makemigrations
      python manage.py migrate
      
    4. 建立使用者

      擴充 auth 模組後,使用的不再是原來 auth_user 表,而是新表 app.UserInfo 表,因此在建立使用者時應該注意。

      # 擴充之前
      from django.contrib.auth.models import User
      user_obj = User.objects.create_user(username='lila', password='1234')
      
      # 擴充之後
      from app.models import UserInfo
      user_obj = UserInfo.objects.create_user(username='lila', password='1234')
      
    • 若已經遷徙了模型,擴充 auth 模組時,需要將 migrations 資料夾下檔案(如:0001_initial.py檔案刪除),否則會報 ValueError: Related model u'app.model' cannot be resolved
    • 若還沒有遷徙模型,那麼正常執行即可。

相關文章