django-auth元件
阿新 • • 發佈:2018-11-26
auth元件
一、auth模組簡介
auth模組是django自帶的使用者認證模組,包含了身份驗證和許可權管理兩部分。
身份驗證用於核實某個使用者是否合法,許可權管理用於決定一個合法使用者有哪些許可權
預設情況下,使用django-admin startproject
命令後,認證模組已經新增到settings檔案中,如果沒有請手動新增
INSTALLED_APPS中新增 `django.contrib.auth` 包含認證框架的核心以及預設模型 `django.contrib.contenttypes` 內容型別系統,用於給模型關聯許可 ------------------------------------------------------------------- MIDDLEWARE中新增 `SessionMiddleware` 通過請求管理會話 `AuthenticationMiddleware` 將會話和使用者關聯
二、使用者物件
在django中使用者物件是使用者認證系統的核心,只有一個使用者模型就是User模型,它位於django.contrib.auth.models
,使用auth_user表來儲存使用者資料
1.建立使用者
create_user(username、password)-------普通使用者
from django.contrib.auth.models import User user = User.objects.create_user(username='使用者名稱',password='密碼',email='郵箱',...) user是一個User類的例項,已經儲存在了資料庫內,你可以隨時修改它的屬性,例如: user.last_name='fj' user.save()
create_superuser(username、password)-----------超級使用者
from django.contrib.auth.models import User
user = User.objects.create_superuser(username='使用者名稱',password='密碼',email='郵箱',...)
2.修改密碼
注:Django預設會對密碼進行加密,因此,不要對密碼進行直接操作
set_password(password)------設定密碼
user.set_password(password='') user.save()
check_password(password)-----檢查密碼是否正確
ok=user.check_password('密碼')
需要提供當前請求使用者的密碼,正確返回True,錯誤返回False
3.使用者驗證
authenticate()
驗證使用者名稱以及密碼是否正確,一般需要username 、password兩個關鍵字引數。
如果認證成功(使用者名稱和密碼正確有效),便會返回一個 User 物件。
from django.contrib import auth
user = authenticate(username='usernamer',password='password')
if user:
#認證成功
else:
#認證失敗
is_authenticated()用來判斷是否通過了認證
def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
4.User物件的屬性
- is_staff:使用者是否擁有網站的管理許可權
- is_active:是否允許使用者登入,設定為False可以在不刪除使用者的前提下禁止使用者登入
三、在檢視中認證使用者
django使用session和中介軟體關聯請求物件中和認證系統,每一次請求都包含一個request.user
屬性,表示當前使用者,如果使用者未登入,該值為AnonymousUser
例項(匿名使用者),如果登入它就是一個User模型的例項。
1.登入使用者
login(HttpRequest,user)---會將使用者的ID儲存在django的session中
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:
login(request,user)
return HttpResponse('登入成功')
else:
return HttpResponse('使用者名稱或密碼錯誤')
2.登出使用者
logout(request)----無返回值
from django.contrib.auth import logout
def logout_view(request):
logout(request)
- 當前請求的session資訊會被全部刪除,如果使用者沒有登入也不會報錯
3.登入認證裝飾器
login_requierd(redirect_field_name='next',login_url='/login/')
用於給檢視新增登入校驗
from django.contrib.auth.decorators import login_required
@login_required
def other_view(request):
...
redirect_field_name
:修改的是瀏覽器 ? 後面的key值login_url='/login/'
如果沒有登入跳轉到的頁面 (區域性設定)- 在
settings.LOGIN_URL
設定沒有登入跳轉的頁面,傳遞當前路徑為url字串的引數(全域性設定) - 如果已經登入,執行正常的檢視
四、擴充套件預設的auth_user表
預設的auth_user表字段是固定的幾個,需要擴充套件的話可以通過下面的方法
1.定義一個表模型,和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):
"""
使用者資訊表
"""
nid = models.AutoField(primary_key=True)
phone = models.CharField(max_length=11, null=True, unique=True)
def __str__(self):
return self.username
建好模型後需要在settings中配置,
AUTH_USER_MODEL='app名.UserInfo'
注:一旦指定了新的表模型,之前的表模型就不能用了。