Django——auth用戶認證

以前咱們在進行用戶校驗的時候,老是從數據庫中獲取數據,而後再進行對比,就像以下這樣:html

def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd  = request.POST.get("pwd")
        ret = models.user_info.objects.filter(user=user,pwd=pwd)
        if ret:
            request.session["user"] = user
            return redirect("/index/")
    return render(request,"login.html")

如今Django提供了一種另外一種認證方式,基於auth組件。python

from django.contrib import auth
def log_in(request):
    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    #驗證成功,返回user對象,不然返回None
    user = auth.authenticate(username=user,password=pwd)
    if user:
        auth.login(request,user)
        #登陸成功以後,在django_session之中會生成一條相應的信息
        #下次訪問頁面的時候就不須要登陸了
        return redirect("/index/")

    return render(request,"log_in.html")


def index(request):
    print(request.user)
    print(type(request.user))
    #若是不能可以獲取到user這個sessionid,就會跳轉
    # if not request.user.id:
    #     return redirect("/log_in/")
    user = request.user
    if not user.is_authenticated():
        return redirect('/log_in/')
    return render(request,"index.html",locals())


def log_out(request):
    auth.logout(request)
    return redirect("/log_in/")
auth用戶認證

首先要導入auth模塊:算法

from django.contrib import auth

1、在auth模塊中經常使用的3個方法數據庫

1.authenticate()django

提供了用戶認證,即驗證用戶名以及密碼是否正確,通常須要username  password兩個關鍵字參數後端

若是認證信息有效,會返回一個  User  對象。authenticate()會在User 對象上設置一個屬性標識那種認證後端認證了該用戶,且該信息在後面的登陸過程當中是須要的。當咱們試圖登錄一個從數據庫中直接取出來不通過authenticate()的User對象會報錯的!!session

user = authenticate(username='someone',password='somepassword')

 

2.login(HttpRequest,user)框架

該函數接受一個HttpRequest對象,以及一個認證了的User對象ide

此函數使用django的session框架給某個已認證的用戶附加上session id等信息函數

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 is not None:
    login(request, user)
    # Redirect to a success page.
    ...
  else:
    # Return an 'invalid login' error message.

 

3.logout(request):註銷用戶

def log_out(request):
    auth.logout(request)
    return redirect("/log_in/")

該函數接受一個HttpRequest對象,無返回值。當調用該函數時,當前請求的session信息會所有清除。該用戶即便沒有登陸,使用該函數也不會報錯。

 

4.user對象的is_authenticated()

要求:

1  用戶登錄後才能訪問某些頁面,

2  若是用戶沒有登陸就訪問該頁面的話直接跳到登陸頁面

3  用戶在跳轉的登錄界面中完成登錄後,自動訪問跳轉到以前訪問的地址

def index(request):
    user = request.user
    if not user.is_authenticated():
        return redirect('/log_in/')
    return render(request,"index.html",locals())

另外一種方法:

django已經爲咱們設計好了一個用於此種狀況的裝飾器:login_requierd()

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

    return render(request,"index.html")

若用戶沒有登陸,則會跳轉到django默認的 登陸URL '/accounts/login/ ' (這個值能夠在settings文件中經過LOGIN_URL進行修改)。並傳遞  當前訪問url的絕對路徑 (登錄成功後,會重定向到該路徑)。

 

2、User對象

User對象屬性:username,password()必填項,password用哈希算法保存在數據庫中。

is_staff:用戶是否擁有網站的管理權限

is_active:是否容許用戶登陸,設置爲「False」,能夠不用刪除用戶來禁止用戶登陸

#咱們能夠取出數據    
user = User.objects.get(username="weiwu")
print(user)
weiwu

#咱們能夠取出相應的值
print(user.username,user.password)
weiwu pbkdf2_sha256$36000$hUxde7APHdey$Fl8XV/bsKq6XmIF0rwEfYwZGvgmbXACw2vg+FvGbz64=

#打印一下類型
print(type(user))
<class 'django.contrib.auth.models.User'>

print(user.is_active)
True

print(user.is_staff)
False

 

1.is_authenticated()

若是是真正的 User 對象,返回值恆爲 True 。 用於檢查用戶是否已經經過了認證。
經過認證並不意味着用戶擁有任何權限,甚至也不檢查該用戶是否處於激活狀態,這只是代表用戶成功的經過了認證。 這個方法很重要, 在後臺用request.user.is_authenticated()判斷用戶是否已經登陸,若是true則能夠向前臺展現request.user.name.

 

2.建立用戶

實用create_user輔助函數建立用戶:

from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email=''

 

3.check_password(passed)

用戶須要修改密碼的時候 首先要讓他輸入原來的密碼 ,若是給定的字符串經過了密碼檢查,返回 True

 

4.修改密碼

實用set_password()來修改密碼

user = User.objects.get(username='')

user.set_password(password='')

user.save

密碼修改實例:

def set_password(request):
  #這個能夠取出當前用戶 user
= request.user state = None if request.method == 'POST': old_password = request.POST.get('old_password', '') new_password = request.POST.get('new_password', '') repeat_password = request.POST.get('repeat_password', '')
     #校驗密碼,若是老密碼經過了校驗,則返回True
if user.check_password(old_password):
       #若是沒有新密碼,默認爲空
if not new_password: state = 'empty'
        
       #若是兩次輸入的密碼不一樣 elif new_password != repeat_password: state = 'repeat_error' else:
         #設置密碼 user.set_password(new_password)
         #推送保存 user.save()
return redirect("/log_in/") else: state = 'password_error' content = { 'user': user, 'state': state, } return render(request, 'set_password.html', content)
相關文章
相關標籤/搜索