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_required def my_view(request): ...
若使用者沒有登入,則會跳轉到django預設的 登入URL '/accounts/login/ ' (這個值可以在settings檔案中透過LOGIN_URL進行修改)。並傳遞 當前訪問url的絕對路徑 ( 登陸成功後,會重定向到該路徑 )。
user物件
User 物件屬性:username, password(必填項)password用雜湊演算法儲存到資料庫
is_staff : 使用者是否擁有網站的管理許可權.
is_active : 是否允許使用者登入, 設定為``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(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
4 、簡單示例
註冊:
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_required 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', '') 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 AbstractUser class 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這張表了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/755/viewspace-2837315/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Django基礎八之認證模組---authDjango
- Django的使用者認證元件Django元件
- 06.Django-使用者認證Django
- Python之time模組詳解Python
- Django框架之auth模組Django框架
- 十七 Django-使用者模組Django
- 登入模組 使用者認證 SpringSecurity +Oauth2+JwtSpringGseOAuthJWT
- Django使用者認證系統(一)User物件Django物件
- ES6之路之模組詳解
- python之logging日誌模組詳解Python
- Flask Session 登入認證模組FlaskSession
- Kerberos認證原理詳解ROS
- Django整合OpenLDAP認證DjangoLDA
- drf JWT認證模組與自定製JWT
- python模組詳解Python
- matplotlib模組詳解
- difflib模組詳解
- psutil模組詳解
- Django重要元件之Auth模組介紹Django元件
- Django框架:13、csrf跨站請求偽造、auth認證模組及相關用法Django框架
- laravel使用者認證圖解Laravel圖解
- Nginx原始碼研究之nginx限流模組詳解Nginx原始碼
- Django(65)jwt認證原理DjangoJWT
- Django之模組的繼承和匯入Django繼承
- 紅外模組詳解
- lms框架模組詳解框架
- 二、django rest_framework原始碼之認證流程剖析DjangoRESTFramework原始碼
- SpringSecurity認證流程原始碼詳解SpringGse原始碼
- OAuth 2.0 授權認證詳解OAuth
- django-reids模組Django
- Delphi LDAP物件管理(使用者登入認證、組、組織)LDA物件
- Token認證——Django Rest framework(1)DjangoRESTFramework
- Django(62)自定義認證類Django
- 詳解AFNetworking的HTTPS模組HTTP
- 深入Django:使用者認證與許可權控制實戰指南Django
- Django學習筆記(13)——Django的使用者認證元件,檢視層和QuerySet APIDjango筆記元件API
- 基於 Laravel Auth 實現自定義介面 API 使用者認證詳解LaravelAPI
- SpringSecurity認證和授權流程詳解SpringGse