詳解Django之auth模組(使用者認證)

來源:互聯網
上載者:User
這篇文章主要介紹了詳解Django之auth模組(使用者認證),現在分享給大家,也給大家做個參考。一起過來看看吧

auth模組是對登入認證方法的一種封裝,之前我們擷取使用者輸入的使用者名稱及密碼後需要自己從user表裡查詢有沒有使用者名稱和密碼符合的對象,

而有了auth模組之後就可以很輕鬆的去驗證使用者的登入資訊是否存在於資料庫中。

除此之外,auth還對session做了一些封裝,方便我們校正使用者是否已登入

auth裡的方法

如果想使用auth模組的方法,必須要先匯入auth模組

from django.contrib import auth

django.contrib.auth中提供了許多方法,這裡主要介紹其中的四個:

1 、authenticate()

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

如果認證資訊有效,會返回一個 User 對象。authenticate()會在User 對象上設定一個屬性標識那種認證後端認證了該使用者,且該資訊在後面的登入過程中是需要的。當我們試圖登陸一個從資料庫中直接取出來不經過authenticate()的User對象會報錯的!!

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

2 、login(HttpRequest, user)

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

此函數使用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) 登出使用者

該函數接受一個HttpRequest對象,無傳回值。當調用該函數時,當前請求的session資訊會全部清除。該使用者即使沒有登入,使用該函數也不會報錯。

from django.contrib.auth import logout  def logout_view(request):  logout(request) # Redirect to a success page.

4 、user對象的 is_authenticated()

要求:

1 使用者登陸後才能訪問某些頁面,

2 如果使用者沒有登入就訪問該頁面的話直接跳到登入頁面

3 使用者在跳轉的登陸介面中完成登陸後,自動訪問跳轉到之前訪問的地址

方法1:

直接用auth的is_authenticated()方法驗證

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

方法2:

根據request.user.username來驗證,如果為空白,則說明沒有登入

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

方法3:

django已經為我們設計好了一個用於此種情況的裝飾器:login_requierd()

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

若使用者沒有登入,則會跳轉到django預設的 登入URL '/accounts/login/ ' (這個值可以在settings檔案中通過LOGIN_URL進行修改)。並傳遞 當前訪問url的絕對路徑 ( 登陸成功後,會重新導向到該路徑 )。

user對象

User 對象屬性:username, password(必填項)password用雜湊演算法儲存到資料庫

is_staff : 使用者是否擁有網站的系統管理權限.

is_active : 是否允許使用者登入, 設定為``False``,可以不用刪除使用者來禁止 使用者登入

2.1 、is_authenticated()

如果是真正的 User 對象,傳回值恒為 True 。 用於檢查使用者是否已經通過了認證。

通過認證並不意味著使用者擁有任何許可權,甚至也不檢查該使用者是否處於啟用狀態,這隻是表明使用者成功的通過了認證。 這個方法很重要, 在後台用request.user.is_authenticated()判斷使用者是否已經登入,如果true則可以向前台展示request.user.name

2.2 、建立使用者

使用 create_user 輔助函數建立使用者:

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

2.3 、check_password(passwd)

user = User.objects.get(username=' ')if user.check_password(passwd):  ......

使用者需要修改密碼的時候 首先要讓他輸入原來的密碼 ,如果給定的字串通過了密碼檢查,返回 True

使用 set_password() 來修改密碼

user = User.objects.get(username='')user.set_password(password='')user.save 

2.5 、簡單樣本

註冊:

def sign_up(request):   state = None  if request.method == 'POST':     password = request.POST.get('password', '')    repeat_password = request.POST.get('repeat_password', '')    email=request.POST.get('email', '')    username = request.POST.get('username', '')    if User.objects.filter(username=username):        state = 'user_exist'    else:        new_user = User.objects.create_user(username=username, password=password,email=email)        new_user.save()         return redirect('/book/')  content = {    'state': state,    'user': None,  }  return render(request, 'sign_up.html', content)  

修改密碼:

@login_requireddef 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', '')    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)

自己建立User表

需要注意的是,以上的所有操作,都是針對django自動建立的auth_user表的,我們可以看一下這張表的結構

這是django給我們自動建立的一張user表,而如果要用auth模組,就必須要使用(或繼承)這張表。

繼承表的好處是我們可以增加一些自己需要的欄位,並且同時可以使用auth模組提供的介面、方法

下面就講一下繼承auth的方法:

1、匯入AbstractUser類,並且寫一個自訂的類,繼承AbstractUser類,如下:

from django.contrib.auth.models import AbstractUserclass UserInfo(AbstractUser):  """  使用者資訊  """  nid = models.AutoField(primary_key=True)  telephone = models.CharField(max_length=11, null=True, unique=True)  ......

需要注意的是,UserInfo表裡就不需要有auth_user裡重複的欄位了,比如說username以及password等,但是還是可以直接使用這些欄位的,並且django會自動將password進行加密

2、這樣寫完之後,還需要在setting.py檔案裡配置:

AUTH_USER_MODEL = 'blog.UserInfo'

這樣,django就知道從blog項目下的models去尋找UserInfo這張表了

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.