1. 程式人生 > >django-auth元件

django-auth元件

auth元件

一、auth模組簡介

auth模組是django自帶的使用者認證模組,包含了身份驗證許可權管理兩部分。

身份驗證用於核實某個使用者是否合法,許可權管理用於決定一個合法使用者有哪些許可權

預設情況下,使用django-admin startproject命令後,認證模組已經新增到settings檔案中,如果沒有請手動新增

INSTALLED_APPS中新增
`django.contrib.auth`  包含認證框架的核心以及預設模型
`django.contrib.contenttypes`  內容型別系統,用於給模型關聯許可
-------------------------------------------------------------------
MIDDLEWARE中新增
`SessionMiddleware`  通過請求管理會話
`AuthenticationMiddleware`  將會話和使用者關聯

二、使用者物件

在django中使用者物件是使用者認證系統的核心,只有一個使用者模型就是User模型,它位於django.contrib.auth.models,使用auth_user表來儲存使用者資料

1.建立使用者

create_user(username、password)-------普通使用者

from django.contrib.auth.models import User
user = User.objects.create_user(username='使用者名稱',password='密碼',email='郵箱',...)

user是一個User類的例項,已經儲存在了資料庫內,你可以隨時修改它的屬性,例如:
user.last_name='fj'
user.save()

create_superuser(username、password)-----------超級使用者

from django.contrib.auth.models import User
user = User.objects.create_superuser(username='使用者名稱',password='密碼',email='郵箱',...)

2.修改密碼

注:Django預設會對密碼進行加密,因此,不要對密碼進行直接操作

set_password(password)------設定密碼

user.set_password(password='')
user.save()

check_password(password)-----檢查密碼是否正確

ok=user.check_password('密碼')

需要提供當前請求使用者的密碼,正確返回True,錯誤返回False

3.使用者驗證

authenticate()

驗證使用者名稱以及密碼是否正確,一般需要username 、password兩個關鍵字引數。

如果認證成功(使用者名稱和密碼正確有效),便會返回一個 User 物件。

from django.contrib import auth
user = authenticate(username='usernamer',password='password')
if user:
    #認證成功
else:
    #認證失敗

is_authenticated()用來判斷是否通過了認證

def my_view(request):
  if not request.user.is_authenticated():
    return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

4.User物件的屬性

  • is_staff:使用者是否擁有網站的管理許可權
  • is_active:是否允許使用者登入,設定為False可以在不刪除使用者的前提下禁止使用者登入

三、在檢視中認證使用者

django使用session和中介軟體關聯請求物件中和認證系統,每一次請求都包含一個request.user屬性,表示當前使用者,如果使用者未登入,該值為AnonymousUser例項(匿名使用者),如果登入它就是一個User模型的例項。

1.登入使用者

login(HttpRequest,user)---會將使用者的ID儲存在django的session中

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:
        login(request,user)
        return HttpResponse('登入成功')
    else:
        return HttpResponse('使用者名稱或密碼錯誤')
    

2.登出使用者

logout(request)----無返回值

from django.contrib.auth import logout
   
def logout_view(request):
  logout(request)
  • 當前請求的session資訊會被全部刪除,如果使用者沒有登入也不會報錯

3.登入認證裝飾器

login_requierd(redirect_field_name='next',login_url='/login/')

用於給檢視新增登入校驗

from django.contrib.auth.decorators import login_required
      
@login_required
def other_view(request):
  ...
  • redirect_field_name:修改的是瀏覽器 ? 後面的key值
  • login_url='/login/' 如果沒有登入跳轉到的頁面 (區域性設定)
  • settings.LOGIN_URL設定沒有登入跳轉的頁面,傳遞當前路徑為url字串的引數(全域性設定)
  • 如果已經登入,執行正常的檢視

四、擴充套件預設的auth_user表

預設的auth_user表字段是固定的幾個,需要擴充套件的話可以通過下面的方法

1.定義一個表模型,和User一對一管理

class UserDetail(models.Model):
    phone=models.CharField(max_length=32)
    # 一對一跟auth_user表做關聯
    # 如果是從外部引入的表模型,是不能加引號的
    # 如果加引號,只是在當前model找
    user=models.OneToOneField(to=User)

2.定義一個表模型,繼承(AbstractUser類)

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    """
    使用者資訊表
    """
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    
    def __str__(self):
        return self.username

建好模型後需要在settings中配置,

AUTH_USER_MODEL='app名.UserInfo'

注:一旦指定了新的表模型,之前的表模型就不能用了。