drf 認證元件

2022-08-22 10:06:10 字數 3861 閱讀 2846

目錄區域性使用

全域性使用

原始碼分析

使用場景:有些介面在進行訪問時,需要確認使用者是否已經登入,比如:使用者需要購買物品時,在結賬的時候,就需要進行登入驗證的。

一般使用者認證都是基於角色認證:

使用者表關聯角色表,角色表關聯許可權表

五表機制

使用者表與角色表多對多、角色表與許可權表多對多

django採用六表機制

使用者表與角色表多對多、角色表與許可權表多對多、使用者表和許可權表多對多

from django.contrib.auth import models

class user(models.model):

username=models.charfield(max_length=32)

password=models.charfield(max_length=32)

user_type=models.integerfield(choices=((1,'超級使用者'),(2,'普通使用者'),(3,'二b使用者')))

class usertoken(models.model):

user=models.onetoonefield(to='user')

token=models.charfield(max_length=64)

from rest_framework.authentication import baseauthentication

class tokenauth():

def authenticate(self, request):

token = request.get.get('token')

token_obj = models.usertoken.objects.filter(token=token).first()

if token_obj:

return

else:

raise authenticationfailed('認證失敗')

def authenticate_header(self,request):

pass

def get_random(name):

import hashlib

import time

md=hashlib.md5()

md.update(bytes(str(time.time()),encoding='utf-8'))

md.update(bytes(name,encoding='utf-8'))

return md.hexdigest()

class login(apiview):

def post(self,reuquest):

back_msg=

try:

name=reuquest.data.get('name')

pwd=reuquest.data.get('pwd')

user=models.user.objects.filter(username=name,password=pwd).first()

if user:

token=get_random(name)

models.usertoken.objects.update_or_create(user=user,defaults=)

back_msg['status']='1000'

back_msg['msg']='登入成功'

back_msg['token']=token

else:

back_msg['msg'] = '使用者名稱或密碼錯誤'

return httpresponse('post')

總結:區域性使用,只需要在檢視類裡加入:

authentication_classes = [tokenauth, ]
全域性使用需要在setting.py中進行配置

rest_framework=
# request物件的user方法

@property

def user(self):

"""returns the user associated with the current request, as authenticated by the authentication classes provided to the request.

"""if not hasattr(self, '_user'):

with wrap_attributeerrors():

self._authenticate()

return self._user

def _authenticate(self):

"""attempt to authenticate the request using each authentication instance

in turn.

"""for authenticator in self.authenticators:

try:

user_auth_tuple = authenticator.authenticate(self)

except exceptions.apiexception:

self._not_authenticated()

raise

if user_auth_tuple is not none:

self._authenticator = authenticator

self.user, self.auth = user_auth_tuple

return

self._not_authenticated()

def _not_authenticated(self):

"""set authenticator, user & authtoken representing an unauthenticated request.

defaults are none, anonymoususer & none.

"""self._authenticator = none

if api_settings.unauthenticated_user:

self.user = api_settings.unauthenticated_user()

else:

self.user = none

if api_settings.unauthenticated_token:

self.auth = api_settings.unauthenticated_token

()else:

self.auth = none

# self.authenticators

def get_authenticators(self):

return [auth() for auth in self.authentication_classes]

認證類使用順序:先用檢視類中的驗證類,再用settings裡配置的驗證類,最後用預設的驗證類

DRF登入認證元件

1.寫乙個登入認證類 類名隨意,類中的方法名固定 from rest framework import exceptions from rest framework.authentication import baseauthentication class auth baseauthenticat...

drf元件之jwt認證

全稱 json web token 解釋 加密字串的原始資料是json,後台產生,通過web傳輸給前台儲存 格式 三段式 頭.載荷.簽名 頭和載荷用的是base64可逆加密,簽名用md5不可逆加密 內容 頭 基礎資訊,也可以為空 加密方式 公司資訊 專案組資訊 載荷 核心資訊 使用者資訊 過期時間 ...

drf 三大認證之 認證元件

原始碼分析 1 apiview的dispath self,request,args,kwargs 2 dispath方法內 self.initial request,args,kwargs 進入三大認證 認證元件 校驗使用者 遊客 合法使用者 非法使用者 非法使用者 代表校驗失敗,丟擲異常,返回40...