1. 程式人生 > >Django框架(十九)—— auth框架:使用者登入、註冊、認證

Django框架(十九)—— auth框架:使用者登入、註冊、認證

auth模組

一、什麼是author模組

Auth模組是Django自帶的使用者認證模組,可以實現包括使用者註冊、使用者登入、使用者認證、登出、修改密碼等功能。預設使用 auth_user 表來儲存使用者資料。

二、auth模組的使用

1、建立超級使用者(create_superuser())

建立超級使用者就是在auth_user表中插入資料,密碼是加密的,因此不能手動在資料庫中插入資料

(1)用命令建立

python3 manage.py createsuperuser

(2)用Python程式碼建立

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

2、驗證使用者(authenticate())

驗證使用者名稱以及密碼是否正確,一般需要username 、password兩個關鍵字引數。如果認證成功(使用者名稱和密碼正確有效),便會返回一個 User 物件

from django.contrib import auth
user = auth.authenticate(request, username=name, password=pwd)

相當於是在資料庫中查詢:

user=models.User.objects.filter(name=name,pwd=pwd).first()

3、登入使用者(login())

該函式接受一個HttpRequest物件,以及一個經過認證的User物件。

該函式實現一個使用者登入的功能。它本質上會在後端為該使用者生成相關session資料。

user = authenticate(username=username, password=password)
if user is not None:
    login(request, user)
    return HttpResponse('登入成功')

4、登入成功

一旦登入成功,調了這個函式login(request,user),在以後的檢視類(函式)中的request中就會有一個user物件,就是當前已登入的使用者物件。

5、登出(logout())

該函式接受一個HttpRequest物件,無返回值。

當呼叫該函式時,當前請求的session資訊會全部清除,即呼叫request.session.flush()。該使用者即使沒有登入,使用該函式也不會報錯。

auth.logout(request)

6、登入認證裝飾器

快捷的給某個檢視新增登入校驗。

若使用者沒有登入,則會跳轉到django預設的 登入URL '/accounts/login/ ' 並傳遞當前訪問url的絕對路徑 (登陸成功後,會重定向到該路徑)。

如果需要自定義登入的URL,則需要在settings.py檔案中通過LOGIN_URL進行修改。

from django.contrib.auth.decorators import login_required

@login_required(redirect_field_name='eee',login_url='/login/')
# redirect_field_name:修改?後面的key值,一般不回去修改

# login_url:如果沒有登入,跳轉到的頁面
    # login_url區域性配置
    @login_required(login_url='/login/')
    
    # login_url全域性配置
    # 在setting檔案中配置    
    LOGIN_URL='/login/'
    直接使用 @login_required

7、建立普通使用者(create_user())

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

8、校驗密碼(check_password())

# 先拿到使用者(可以是登入使用者,可以現查)
user = request.user
# 或者 
user = authenticate(username=username, password=password)

pwd = request.POST.get('pwd')
ret = user.check_password(pwd)

9、修改密碼(set_password())

注意:設定完一定要呼叫使用者物件的save方法!!!

修改密碼時,可以先校驗原密碼輸入是否正確,原密碼正確再開始修改密碼

user.set_password(pwd)
user.save()

10、is_authenticated()

用來判斷當前請求是否通過了認證。如果通過驗證,是true,反之false

ret = request.user.is_authenticated()

11、刪除使用者

刪除使用者和用orm在表中刪除資料一樣

12、User物件的其他屬性

# 在網站上線以前,將is_active和is_staff設定為False
is_active    # 禁止登入網站(使用者還存在,封號)
is_staff    # 是否對網站有管理許可權(能不能登入admin)

request.user.is_active = False
request.user.is_staff = False

三、擴充套件預設的auth_user表

1、方法一:定義一個表模型,跟User一對一關聯

from django.contrib.auth.models import 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):
    # username,password...都繼承了
    phone=models.CharField(max_length=32)
    sex=models.BooleanField()
    

注意:

  • 一旦我們通過繼承來實現擴充套件auth_user表,那麼做資料庫遷移,以後就沒有auth_user這個表了,以後認證元件用的表就是UserInfo。原來使用 auth_user 表模型的地方全部要用新的表模型——UserInfo

  • 引用Django自帶的User表,繼承使用時需要設定,在setting中對新表進行配置:

AUTH_USER_MODEL ='app01.UserInfo'