目錄區域性使用
全域性使用
原始碼分析
使用場景:有些介面在進行訪問時,需要確認使用者是否已經登入,比如:使用者需要購買物品時,在結賬的時候,就需要進行登入驗證的。
一般使用者認證都是基於角色認證:
使用者表關聯角色表,角色表關聯許可權表
五表機制:
使用者表與角色表多對多、角色表與許可權表多對多
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...