当前位置: 首页 > 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中的批量操作(批量新增、批量删除、批量更新)
  • Angular Elements 及其运作原理
  • Date型的使用
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • ES6语法详解(一)
  • JavaScript创建对象的四种方式
  • js操作时间(持续更新)
  • js正则,这点儿就够用了
  • JS专题之继承
  • KMP算法及优化
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • nginx 负载服务器优化
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • use Google search engine
  • Vue实战(四)登录/注册页的实现
  • 对象管理器(defineProperty)学习笔记
  • 京东美团研发面经
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 小程序开发之路(一)
  • 写代码的正确姿势
  • 新书推荐|Windows黑客编程技术详解
  • 运行时添加log4j2的appender
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • #13 yum、编译安装与sed命令的使用
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (70min)字节暑假实习二面(已挂)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)视频码率,帧率和分辨率的联系与区别
  • .net CHARTING图表控件下载地址
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划