IT教程 ·

drf认证组件、权限组件、jwt认证、签发、jwt框架运用

分析思维 第四篇:数据分析入门阶段——描述性统计分析和相关分析

 

一、注册接口

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要求不能够),正当用户无限制
"""

drf认证组件、权限组件、jwt认证、签发、jwt框架运用 IT教程 第1张

七、jwt认证示意图

""" jwt上风
1)没有数据库写操纵,高效
2)服务器不存token,低耗
3)签发校验都是算法,集群
"""

drf认证组件、权限组件、jwt认证、签发、jwt框架运用 IT教程 第2张

drf认证组件、权限组件、jwt认证、签发、jwt框架运用 IT教程 第3张

drf认证组件、权限组件、jwt认证、签发、jwt框架运用 IT教程 第4张
drf认证组件、权限组件、jwt认证、签发、jwt框架运用 IT教程 第5张

八、 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/ 接口接见个人中间
"""

你知道数字签名吗?

参与评论