1. 程式人生 > >drf認證元件、許可權元件、jwt認證、簽發、jwt框架使用

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

Rest Framework第四天-認證元件許可權元件頻率元件

                         

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註解】1Spring元件註冊

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> <