drf認證元件、許可權元件、jwt認證、簽發、jwt框架使用
目錄
- 一、註冊介面
- urls.py
- views.py
- serializers.py
- 二、登入介面
- 三、使用者中心介面(許可權校驗)
- urls.py
- views.py
- serializers.py
- 四、圖書資源介面
- urls.py
- views.py
- serializers.py
- 五、認證元件
- 重點
- 自定義認證類
- 六、許可權元件
- 重點
- 自定義許可權類
- 七、jwt認證示意圖
- 八、 jwt認證演算法:簽發與校驗
- 簽發:根據登入請求提交來的 賬號 + 密碼 + 裝置資訊 簽發 token
- 校驗:根據客戶端帶token的請求 反解出 user 物件
- 九、drf專案的jwt認證開發流程(重點)
- 十、drf-jwt框架基本使用
- 安裝(終端)
- 簽發token
- 校驗token(認證元件)
- 設定需要登入才能訪問的介面進行測試(views.py)
- 測試訪問登入認證介面(Postman)
一、註冊介面
urls.py
router.register('register', views.RegisterViewSet, 'register') from rest_framework_jwt.views import ObtainJSONWebToken urlpatterns = [ url('^login/$', ObtainJSONWebToken.as_view()), url('', include(router.urls)) ]
views.py
from rest_framework.viewsets import GenericViewSet, ModelViewSet
from rest_framework import mixins
from . import models, serializers
class RegisterViewSet(GenericViewSet, mixins.CreateModelMixin):
queryset = models.User.objects.filter(is_active=True).all()
serializer_class = serializers.RegisterSerializer
serializers.py
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from . import models
class RegisterSerializer(serializers.ModelSerializer):
re_password = serializers.CharField(write_only=True, min_length=8, max_length=18)
class Meta:
model = models.User
fields = ('username', 'password', 're_password', 'mobile')
extra_kwargs = {
'password': {
'write_only': True,
'min_length': 8,
'max_length': 18
}
}
# username和mobile可以自定義區域性鉤子校驗(省略)
def validate(self, attrs):
password = attrs.get('password')
re_password = attrs.pop('re_password')
if password != re_password:
raise ValidationError({'re_password': 'password confirm error'})
return attrs
# 需要重寫create,建立使用者需要密文
def create(self, validated_data):
return models.User.objects.create_user(**validated_data)
二、登入介面
呼叫寫好的登入介面即可
from rest_framework_jwt.views import ObtainJSONWebToken
urlpatterns = [
url('^login/$', ObtainJSONWebToken.as_view()),
url('', include(router.urls))
]
三、使用者中心介面(許可權校驗)
urls.py
router.register('user/center', views.UserCenterViewSet, 'center')
views.py
from rest_framework.permissions import AllowAny, IsAuthenticated, IsAdminUser, IsAuthenticatedOrReadOnly
class UserCenterViewSet(GenericViewSet, mixins.RetrieveModelMixin):
permission_classes = [IsAuthenticated, ]
queryset = models.User.objects.filter(is_active=True).all()
serializer_class = serializers.UserCenterSerializer
'''
AllowAny:遊客也可訪問
IsAuthenticated:必須登入的使用者 才有許可權
IsAdminUser:必須登入,並且時後臺使用者 才有許可權
IsAuthenticatedOrReadOnly:讀可以(get請求可以),但是寫(post請求)必須登入
'''
serializers.py
class UserCenterSerializer(serializers.ModelSerializer):
class Meta:
model = models.User
fields = ('username', 'mobile', 'icon', 'email')
四、圖書資源介面
urls.py
router.register('books', views.BookViewSet, 'book')
views.py
class BookViewSet(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = serializers.BookSerializer
serializers.py
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = ('name', )
五、認證元件
重點
"""
1)認證規則
2)如何自定義認證類
3)我們一般不需要自定義認證類,在settings中全域性配置第三方 jwt 認證元件提供的認證類即可
"""
自定義認證類
"""
1)自定義認證類,繼承 BaseAuthentication 類
2)必須重寫 authenticate(self, request) 方法
沒有認證資訊,返回None:匿名使用者(遊客) => 匿名使用者request.user也有值,就是"匿名物件(Anonymous)"
有認證資訊,且通過,返回(user, token):合法使用者 => user物件會存到request.user中
有認證資訊,不通過,拋異常:非法使用者
"""
六、許可權元件
重點
"""
1)許可權規則
2)如何自定義許可權類
3)我們一般在檢視類中區域性配置drf提供的許可權類,但是也會自定義許可權類完成區域性配置
"""
自定義許可權類
"""
1)自定義許可權類,繼承 BasePermission 類
2)必須重寫 has_permission(self, request, view): 方法
設定許可權條件,條件通過,返回True:有許可權
設定許可權條件,條件失敗,返回False:有許可權
3)drf提供的許可權類:
AllowAny:匿名與合法使用者都可以
IsAuthenticated:必須登入,只有合法使用者可以
IsAdminUser:必須是admin後臺使用者
IsAuthenticatedOrReadOnly:匿名只讀(get請求可以)(post請求不可以),合法使用者無限制
"""
七、jwt認證示意圖
""" jwt優勢
1)沒有資料庫寫操作,高效
2)伺服器不存token,低耗
3)簽發校驗都是演算法,叢集
"""
八、 jwt認證演算法:簽發與校驗
"""
1)jwt分三段式:頭.體.簽名 (head.payload.sgin)
2)頭和體是可逆加密,讓伺服器可以反解出user物件;簽名是不可逆加密,保證整個token的安全性的
3)頭體簽名三部分,都是採用json格式的字串,進行加密,可逆加密一般採用base64演算法,不可逆加密一般採用hash(md5)演算法
4)頭中的內容是基本資訊:公司資訊、專案組資訊、token採用的加密方式資訊
{
"company": "公司資訊",
...
}
5)體中的內容是關鍵資訊:使用者主鍵、使用者名稱、簽發時客戶端資訊(裝置號、地址)、過期時間
{
"user_id": 1,
...
}
6)簽名中的內容時安全資訊:頭的加密結果 + 體的加密結果 + 伺服器不對外公開的安全碼 進行md5加密
{
"head": "頭的加密字串",
"payload": "體的加密字串",
"secret_key": "安全碼"
}
"""
簽發:根據登入請求提交來的 賬號 + 密碼 + 裝置資訊 簽發 token
"""
1)用基本資訊儲存json字典,採用base64演算法加密得到 頭字串
2)用關鍵資訊儲存json字典,採用base64演算法加密得到 體字串
3)用頭、體加密字串再加安全碼資訊儲存json字典,採用hash md5演算法加密得到 簽名字串
賬號密碼就能根據User表得到user物件,形成的三段字串用 . 拼接成token返回給前臺
"""
校驗:根據客戶端帶token的請求 反解出 user 物件
"""
1)將token按 . 拆分為三段字串,第一段 頭加密字串 一般不需要做任何處理
2)第二段 體加密字串,要反解出使用者主鍵,通過主鍵從User表中就能得到登入使用者,過期時間和裝置資訊都是安全資訊,確保token沒過期,且時同一裝置來的
3)再用 第一段 + 第二段 + 伺服器安全碼 不可逆md5加密,與第三段 簽名字串 進行碰撞校驗,通過後才能代表第二段校驗得到的user物件就是合法的登入使用者
"""
九、drf專案的jwt認證開發流程(重點)
"""
1)用賬號密碼訪問登入介面,登入介面邏輯中呼叫 簽發token 演算法,得到token,返回給客戶端,客戶端自己存到cookies中
2)校驗token的演算法應該寫在認證類中(在認證類中呼叫),全域性配置給認證元件,所有檢視類請求,都會進行認證校驗,所以請求帶了token,就會反解出user物件,在檢視類中用request.user就能訪問登入的使用者
注:登入介面需要做 認證 + 許可權 兩個區域性禁用
"""
十、drf-jwt框架基本使用
安裝(終端)
>: pip install djangorestframework-jwt
簽發token
(登入介面):檢視類已經寫好了,配置一下路由就行(urls.py)
from rest_framework_jwt.views import ObtainJSONWebToken
# api/urls.py
urlpatterns = [
# ...
url('^login/$', ObtainJSONWebToken.as_view()),
]
# Postman請求:/api/login/,提供username和password即可
校驗token(認證元件)
認證類已經寫好了,全域性配置一下認證元件就行了(settings.py)
# drf-jwt的配置
import datetime
JWT_AUTH = {
# 配置過期時間
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
}
# drf配置(把配置放在最下方)
REST_FRAMEWORK = {
# 自定義三大認證配置類們
'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_jwt.authentication.JSONWebTokenAuthentication'],
# 'DEFAULT_PERMISSION_CLASSES': [],
# 'DEFAULT_THROTTLE_CLASSES': [],
}
設定需要登入才能訪問的介面進行測試(views.py)
from rest_framework.permissions import IsAuthenticated
class UserCenterViewSet(GenericViewSet, mixins.RetrieveModelMixin):
# 設定必須登入才能訪問的許可權類
permission_classes = [IsAuthenticated, ]
queryset = models.User.objects.filter(is_active=True).all()
serializer_class = serializers.UserCenterSerializer
測試訪問登入認證介面(Postman)
"""
1)用 {"username": "你的使用者", "password": "你的密碼"} 訪問 /api/login/ 介面等到 token 字串
2)在請求頭用 Authorization 攜帶 "jwt 登入得到的token" 訪問 /api/user/center/1/ 介面訪問個人中心
"""
相關推薦
drf認證元件、許可權元件、jwt認證、簽發、jwt框架使用
目錄 一、註冊介面 urls.py views.py serializers.py 二、登入介面 三、使用者中心介面(許可權校驗) urls.
drf token重新整理配置、認證元件(使用)、許可權元件(使用)、頻率元件(使用)、異常元件(使用)
目錄 一、特殊路由對映的請求 二、token重新整理機制配置(瞭解) 三、認證元件專案使用:多方式登入 1、urls.py 路由 2、views.py 檢視 3、seriali
rest-framework認證、許可權元件
認證元件: models 1 class User(models.Model): 2 username = models.CharField(max_length=32) 3 password = models.CharField(max_length=32) 4
20.DjangoRestFramework學習三之認證元件、許可權元件、頻率元件、url註冊器、響應器、分頁元件
一 認證元件 1. 區域性認證元件 我們知道,我們不管路由怎麼寫的,對應的檢視類怎麼寫的,都會走到dispatch方法,進行分發, 在咱們看的APIView類中的dispatch方法的原始碼中,有個self.initial(request, *args, **kwargs),那麼認證、許可
DAY99 - Rest Framework(四)- 認證元件和許可權元件
一、認證元件 1.使用 # 模型層 class User(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32) class UserToken(models
認證元件與許可權元件,以及序列化元件
認證元件 -認證token py檔案 from rest_framework import exceptions # 沒查到,拋異常 from rest_framework.authentication import BaseAuthentication # 繼
rest_framwork之認證元件,許可權元件,頻率元件
1 認證元件2 許可權元件3 頻率元件1 認證元件 (1) 定義一個認證類 class UserAuth(): def authenticate_header(self,reuqest): &
DRF之版本控制、認證和許可權元件
一、版本控制組件 1、為什麼要使用版本控制 首先我們開發專案是有多個版本的當我們專案越來越更新,版本就越來越多,我們不可能新的版本出了,以前舊的版本就不進行維護了像bootstrap有2、3、4版本的,每個版本都有它對應的url,https://v2.bootcss.com/ 、 https://v3.b
Rest_Framework之認證、許可權、頻率元件原始碼剖析
一:使用RestFramwork,定義一個檢視 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet): queryset = Book.objects.all()
Rest-framework之drf認證元件,許可權元件
Rest-framework之drf認證元件,許可權元件 1.views檢視層 from django.shortcuts import render from rest_framework.views import APIView from app01 import
DRF的版本、認證、許可權
DRF的版本 版本控制是做什麼用的, 我們為什麼要用 首先我們要知道我們的版本是幹嘛用的呢~~大家都知道我們開發專案是有多個版本的~~ 當我們專案越來越更新~版本就越來越多~~我們不可能新的版本出了~以前舊的版本就不進行維護了~~~ 那我們就需要對版本進行控制~~這個DRF也給我們提供了一些封裝好的版
drf元件之jwt認證
drf元件之jwt認證模組 一、認證規則 全稱:json web token 解釋:加密字串的原始資料是json,後臺產生,通過web傳輸給前臺儲存 格式:三段式 - 頭.載荷.簽名 - 頭和載荷才有的是base64可逆加密,簽名才有md5不可逆加密 內容: 頭(基礎資訊,也可以為空):加密方式、公司資訊、專
【Spring註解】1、Spring元件註冊
1、@Configuration: 指定該註解的類是個配置類,對應之前的配置檔案 2、@Bean: 指定該方法作為一個Bean元件,它會往容器中註冊一個Bean元件; 其中型別為返回值,id預設為方法名;
小程式學習之旅----slot 子元件呼叫父元件的方法、父元件呼叫子元件的方法
slot子元件 <!--pages/user/user.wxml--> <header title='{{title}}'></header> {{title}} <footer> <button>我是footer子元件裡的按鈕&l
55、控制元件、事件處理和佈局介紹
學習目標: 1、瞭解Swing提供的控制元件 2、掌握控制元件的不同的事件器 學習過程: 這裡我們就一一介紹一下swing中常用的一些控制元件。 一、常用控制元件例項: 先看看那下圖,初步瞭解一下每個控制元件的基本形式。 1、jLable
Tomcat原始碼分析:一、tomcat元件認識
前言 最近一次上線過程中出現了jekin是自動化部署的web環境跟本地開發環境不一致的情況,導致生產環境應用訪問失敗,因此閱讀tomcat原始碼,以加深對web的認識。 基本元件 在閱讀原始碼之前,最好是對整個應
GUI的最終選擇 Tkinter(三):Checkbutton元件和Radiobutton元件、LabelFrame元件
Checkbutton元件 Checkbutton元件就是常見的多選按鈕,而Radiobutton則是單選按鈕 1 from tkinter import * 2 3 root = Tk() 4 v = IntVar() #設定一個Tkinter變數,用於表示該按鈕是否被選中 5
Centos6.10下Open-falcon學習記錄(零)——主機監控、Nodata元件、叢集監控
記錄了學習過程,官方文件地址http://book.open-falcon.org/zh_0_2/usage/getting-started.html 另外還看了Open-falcon作者的寫的設計理念的文,見open-falcon編寫的整個腦洞歷程 1 主機監控 1.1 主機配置
vue-cli 腳手架、vue元件引入圖片出錯解決辦法
問題:vue-cli腳手架中 元件相互巢狀,圖片路徑報錯。 解決辦法:首先把圖片引入進來,然後再付給data(); <template> <img :src="picUrl"/> </template> <style> <