当前位置: 首页 > news >正文

DRF 用户认证

验证方式:

BasicAuthentication:基础验证,通过用户名和密码验证

SessionAuthentication:使用django的session验证

TokenAuthentication:token认证

可设置多个验证方式,有一个通过即可。验证通过后request.user会是对应User实例

权限策略:

AllowAny:没有限制

IsAuthenticated:已认证

其他权限策略:DRF权限

光设置验证是没用的,还的设置权限。才能起到必须登录才能操作。

全局配置

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ),
}

单独配置:

    authentication_classes = []
    permission_classes = [AllowAny]

也可以单独使用,可以覆盖全局配置。比如注册,登录肯定不需要进行验证。

SessionAuthentication:

 

 需要在INSTALLED_APPS和MIDDLEWARE中进行配置。然后使用python manage.py migrate创建数据库表,默认是使用数据库保存session。

        login_info = {
            "username": data.get("username"),
            "password": data.get("password"),
        }
        try:
            user = authenticate(**login_info)
            if user is not None:
                login(request, user)

使用authenticate()校验用户名密码,使用login()方法创建session。

Django_session表会增加一条该用户的session记录

  在请求头中使用

使用SessionAuthentication可能会提示"detail": "CSRF Failed: CSRF token missing." DRF默认是启用CSRF的。

 

把CSRF校验设置成True,然后注册到中间件。

from django.utils.deprecation import MiddlewareMixin
class NotUseCsrfTokenMiddlewareMixin(MiddlewareMixin):
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)

 

logout(request)

该方法可删除session

TokenAuthentication:

需要在INSTALLED_APPS中注册,然后执行python manage.py migrate

 

        login_info = {
            "username": data.get("username"),
            "password": data.get("password"),
        }
        try:
            user = authenticate(**login_info)
            if user is not None:
                login(request, user)
                token, created = Token.objects.get_or_create(user=user)
                return SuccessResponse(data={"token": token.key})
        except Exception as e:
            return ErrorResponse(msg=str(e))
token, created = Token.objects.get_or_create(user=user)

token.key 可以获取对应token的值

 authtoken_token表会增加一条该用户的token记录

 

 在请求头中使用Authorization参数,Token后要空两格再跟上具体值

    def post(self, request):
        try:
            Token.objects.filter(user=request.user).delete()
            logout(request)
        except ObjectDoesNotExist as e:
            return ErrorResponse(msg=str(e))
        return SuccessResponse()

退出登录,直接将token删除即可,如果同时使用session。删除session的操作需要放在删除token后面?(放前面会报错,不知道是不是都这样,还是我的代码会这样)

修改默认错误格式:

默认的错误只有一句detail,无法自定义格式。比如我想在没有登录的时候code返回2,其他错误code返回1来区分是否需要跳转登录。

from rest_framework.views import exception_handler
def custom_exception_handler(exc, context):
    # Call REST framework's default exception handler first,
    # to get the standard error response.
    response = exception_handler(exc, context)
    # Now add the HTTP status code to the response.
    if response is not None:
        message = response.data.get('detail')
        if message == '身份认证信息未提供。':
            response.data['code'] = 2
        else:
            response.data['code'] = 1
        response.data['msg'] = message
        response.data['data'] = None
        # 删除detail字段
        del response.data['detail']
    
    return response
    'EXCEPTION_HANDLER': (
        'Common.common.custom_exception_handler'
    )

需要在REST_FRAMEWORK中增加。

相关文章:

  • 系统架构演变历史及集群、分布式、微服务、SOA的概念区别
  • 四、RocketMq本地集群搭建
  • 金仓数据库 KingbaseES 插件参考手册 xml2
  • FITC-PEG-SH/Fluorescent-PEG-SH 多种分子量可选/荧光素聚乙二醇巯基 FITC-PEG-SH
  • 常用hooks用法总结
  • 赛默飞世尔Thermo Fisher仪器电路板维修故障概述
  • 对于生物素-PEG32-NHS 酯,Biotin-PEG32-NHS ester物理性质大家了解多少了?
  • 关于神经网络的正确说法,神经网络通俗的解释是
  • python带你采集桌游、剧本杀游戏店数据信息~
  • sd卡数据丢失的原因有哪些?常见的sd卡数据丢失原因及恢复方法
  • 深度神经网络的训练过程
  • 【04】MapReduce
  • 《MySQL实战45讲》——学习笔记02 “深入浅出索引、最左前缀原则、索引下推优化“
  • 七 R语言|箱须图、饼图的绘制
  • 【MyBatis笔记07】MyBatis中的批量操作(批量新增、批量删除、批量更新)
  • 77. Combinations
  • Angular Elements 及其运作原理
  • const let
  • MaxCompute访问TableStore(OTS) 数据
  • scrapy学习之路4(itemloder的使用)
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • ubuntu 下nginx安装 并支持https协议
  • WePY 在小程序性能调优上做出的探究
  • Yii源码解读-服务定位器(Service Locator)
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 排序算法学习笔记
  • 普通函数和构造函数的区别
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一份游戏开发学习路线
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (11)MSP430F5529 定时器B
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (55)MOS管专题--->(10)MOS管的封装
  • (java)关于Thread的挂起和恢复
  • (编译到47%失败)to be deleted
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • *** 2003
  • .gitattributes 文件
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .Net Core与存储过程(一)
  • .Net Winform开发笔记(一)
  • .NET 事件模型教程(二)
  • .Net 知识杂记
  • .net反混淆脱壳工具de4dot的使用
  • .net分布式压力测试工具(Beetle.DT)
  • .net通过类组装数据转换为json并且传递给对方接口
  • .net与java建立WebService再互相调用
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化