BaseAuthentication 類:
django rest framework 通過 BaseAuthentication 實(shí)現(xiàn)認(rèn)證功能
無論是自定義的認(rèn)證類還是 rest framework 自帶的認(rèn)證類都應(yīng)該繼承 BaseAuthentication
BaseAuthentication 中有兩個(gè)方法 authenticate 和 authenticate_header, 其中 authenticate 方法必須實(shí)現(xiàn)
如果用戶需要自定義認(rèn)證方法則繼承 BaseAuthentication 重寫 authenticate 方法即可
?
?
models.py
為安仁等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及安仁網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、安仁網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
from django.db import models
class UserInfo(models.Model):
user_type_choices = (
(1, '普通用戶'),
(2, 'VPI'),
(3, 'SVPI'),
)
user_type = models.IntegerField(choices=user_type_choices)
username = models.CharField(max_length=32, unique=True)
password = models.CharField(max_length=64)
class UserToken(models.Model):
user = models.OneToOneField('UserInfo', models.CASCADE)
token = models.CharField(max_length=64)
?
?
APP_DIR/utils/auth.py ? ? ? ? ? # 在和 views.py 同級的目錄創(chuàng)建 utils 包, 在 utils 中創(chuàng)建 auth.py 文件, 將認(rèn)證相關(guān)的代碼放入其中
from rest_framework import exceptions
from rest_framework.authentication import BaseAuthentication
from app01 import models
# 實(shí)現(xiàn)自定義的認(rèn)證類
class Authtication(BaseAuthentication):
def authenticate(self, request):
# 這兒的 request 對象不是 django 原生的 request 而是 rest_framework 內(nèi)部進(jìn)行封裝過的 request
# 使用 request._request 調(diào)用 django 原生的 request 對象
token = request._request.GET.get('token')
# 檢查用戶的 token 是否合法
token_obj = models.UserToken.objects.filter(token=token).first()
if not token_obj:
# rest_framework 會(huì)在內(nèi)部捕捉這個(gè)異常并返回給用戶認(rèn)證失敗的信息
raise exceptions.AuthenticationFailed('用戶認(rèn)證失敗')
# 在 rest_framework 內(nèi)部會(huì)將這兩個(gè)字段賦值給request以供后續(xù)調(diào)用
return (token_obj.user, token_obj)
?
?
views.py
from django.http import JsonResponse
from rest_framework.views import APIView
from app01.utils.auth import Authtication
import hashlib
import time
# 生成 token 字符串
def md5(user):
ctime = str(time.time())
m = hashlib.md5(bytes(user, encoding='utf-8'))
m.update(bytes(ctime, encoding='utf-8'))
return m.hexdigest()
# 用戶登錄
class AuthView(APIView):
def post(self, request):
ret = {'code':1000, 'msg':None}
try:
user = request._request.POST.get('username')
pwd = request._request.POST.get('password')
obj = models.UserInfo.objects.filter(username=user, password=pwd).first()
if not obj:
ret['code'] = 1001
ret['msg'] = "用戶名或密碼錯(cuò)誤"
# 為登錄用戶創(chuàng)建token
token = md5(user)
#存在更新 不存在創(chuàng)建
models.UserToken.objects.update_or_create(user=obj, defaults={'token':token})
ret['token'] = token
except:
ret['code'] = 1002
ret['msg'] = '請求異常'
return JsonResponse(ret)
# 業(yè)務(wù)代碼
class Order(APIView):
# 注冊自定義的認(rèn)證類, 可以有多個(gè), 從左到右進(jìn)行認(rèn)證匹配
authentication_classes = [Authtication,]
def get(self, request):
# request.user 這個(gè)值等于 Authtication 返回的元組的第一個(gè)值
# request.auth 這個(gè)值等于 Authtication 返回的元組的第二個(gè)值
ret = {'code':1000, 'msg':None, 'data':None}
ret['data'] = '歡迎使用本系統(tǒng)'
return JsonResponse(ret)
?
?
rest_framework 內(nèi)置的認(rèn)證類:
BasicAuthentication # 基于瀏覽器實(shí)現(xiàn)的 Basic 認(rèn)證, ftp 使用網(wǎng)頁登錄時(shí)使用的就是 Basic 認(rèn)證
SessionAuthentication # 基于 django 的 user.is_active 進(jìn)行認(rèn)證
TokenAuthentication # 簡單的基于 token 的認(rèn)證
RemoteUserAuthentication # 簡單的遠(yuǎn)程用戶認(rèn)證實(shí)現(xiàn)
?
?
配置全局生效的認(rèn)證類和匿名用戶:
自定義的認(rèn)證類如果每次都在指定的類中使用 authentication_classes 指定那么就有可能出現(xiàn)大量的重復(fù)代碼
我們可以通過全局設(shè)置讓指定的認(rèn)證類對繼承至 APIView 的所有類生效
settings.py
REST_FRAMEWORK = {
# 設(shè)置全局生效的認(rèn)證類(可以有多個(gè))
# app01 為 django app 的名稱
# utils 為 app 目錄下面的 utils 目錄(這個(gè)目錄必須包含 __init__.py 文件)
# auth 為 utils 目錄下面的 auth.py 文件
# Authtication 為 auth.py 文件里面的 Authtication 類
# 這兒的設(shè)置其實(shí)就是使用 from ... import ... 的路徑
'DEFAULT_AUTHENTICATION_CLASSES': ["app01.utils.auth.Authtication",],
#匿名用戶配置
'UNAUTHENTICATED_USER': None, # 設(shè)置匿名用戶的用戶名, 默認(rèn)為 AnonymousUser, 使用 request.user 查看
'UNAUTHENTICATED_TOKEN': None, # 設(shè)置匿名用戶的 token, 默認(rèn)為 None, 使用 request.auth 查看
}
?
?
指定 View 類不使用全局的認(rèn)證類:
在不使用全局認(rèn)證類的 View 類中添加 authentication_classes = [] 或者 authentication_classes = ['xxxx']
# authentication_classes = [] 表示不使用認(rèn)證
# authentication_classes = ['xxxx'], xxxx 表示當(dāng)前類需要使用的認(rèn)證類用于替換全局類
文章名稱:djangorestframework用戶認(rèn)證
鏈接分享:http://m.rwnh.cn/article38/gshopp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、建站公司、網(wǎng)站建設(shè)、外貿(mào)建站、網(wǎng)站收錄、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)