auth驗證

一  auth模塊

auth是Django內部的用戶認證系統,它默認使用 auth_user 表來存儲用戶數據。html

from django.contrib import auth

1. create_user()

auth 提供的一個建立新用戶的方法,須要提供必要參數(username、password)等。python

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

注意:create方法加入數據庫中的密碼都是明文數據庫

2. create_superuser()

auth 提供的一個建立新的超級用戶的方法,須要提供必要參數(username、password)等。django

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

或者:後端

python manage.py createsuperuser

3. authenticate()   

驗證用戶名以及密碼是否正確,通常須要username 、password兩個關鍵字參數。若是認證成功,返回一個 User 對象,不成功返回None瀏覽器

authenticate()會在該 User 對象上設置一個屬性來標識後端已經認證了該用戶,且該信息在後續的登陸過程當中是須要的。session

user = authenticate(username='theuser',password='thepassword')

4. login(HttpRequest, user)  

該函數接受一個HttpRequest對象,以及一個通過認證的User對象。實現一個用戶登陸的功能。它本質上會在後端爲該用戶生成相關session數據app

from django.contrib import auth
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        pwd = request.POST.get('password')
        # User.objects.create_user(is_active=True, username=username, password=pwd, is_staff=True)
        user = auth.authenticate(username=username, password=pwd)
        if user:
            auth.login(request, user) #生成session
            return redirect('/app01/index/')
    return render(request, 'login.html')

注意:函數

在沒有login_requierd()的前提下,只要使用login(request, user_obj)以後,request.user就能拿到當前登陸的用戶對象。不然request.user獲得的是一個匿名用戶對象(AnonymousUser Object)。工具

5. logout(request) 

該函數接受一個HttpRequest對象,無返回值。

當調用該函數時,當前請求的session信息會所有清除。該用戶即便沒有登陸,使用該函數也不會報錯。本質就是:request.session.flush()

def logout(request):
    auth.logout(request)
    return HttpResponse('註銷成功')

注意:session只是以瀏覽器爲依據,在同一瀏覽器上,後登錄的用戶會把先前登錄的用戶註銷

6. is_authenticated()

用來判斷當前請求是否經過了認證。

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

7. login_requierd()

auth 給咱們提供的一個裝飾器工具,用來快捷的給某個視圖添加登陸校驗。

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

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

若是須要自定義登陸的URL,則須要在settings.py文件中經過LOGIN_URL進行修改。

LOGIN_URL = '/login/'  # 這裏配置成你項目登陸頁面的路由

8. check_password(raw_password)

auth 提供的一個檢查密碼是否正確的方法,須要提供當前請求用戶的密碼。

密碼正確返回True,不然返回False。

ok = user_obj.check_password('密碼')

或者直接針對當前請求的user對象校驗原密碼是否正確:

ok = request.user.check_password(raw_password='原密碼')

9. set_password(raw_password)

auth 提供的一個修改密碼的方法,接收 要設置的新密碼 做爲參數。

注意:設置完必定要調用用戶對象的save方法!

user_obj.set_password('新密碼')
user_obj.save()

二  擴展auth_user表

1. 新建表, 一對一關聯

在models寫入:

from django.db import models
from django.contrib.auth.models import User
class UserDetail(models.Model):
    phone = models.CharField(max_length=11)
    user2phone = models.OneToOneField(to=User, on_delete=models.CASCADE,related_name='phone2user')

2. 繼承的方式

新建表app01_userinfo代替auth_user,auth_user再也不存在。該方法在一開始便建立好,避免後期修改。

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    phone = models.CharField(max_length=11)
    addr = models.CharField(max_length=128)

注意:在settings.py中必定要加入:AUTH_USER_MODEL = 'app名.類名', 告訴Django項目用哪張表作認證

AUTH_USER_MODEL = 'blog.UserInfo'

實例:

# 繼承前
def register(request):
    from django.contrib.auth.models import User
    user_obj = User.objects.create_user(username="matt", password="123")
# 使用繼承後,就沒有User了,建立新用戶須要改變
def register(request):
    from app01.model import models
    user_obj = modles.Userinfo.objects.create_user(username="matt", password="123"

 參考:

https://www.cnblogs.com/zgf-666/p/9124261.html

相關文章
相關標籤/搜索