首页 > 其他分享 >DRF之认证

DRF之认证

时间:2022-12-22 16:14:23浏览次数:33  
标签:models request 认证 token user password DRF

drf认证

  • 参考网址

https://www.cnblogs.com/yangyi215/p/15041975.html

  • 作用: 校验用户是否登录

  • 书写步骤


- 写一个类,继承BaseAuthentication,重写类中的重写authenticate方法,认证的逻辑写在其中

    - 如果认证通过,返回两个值,一个值最终给了Requet.user,另外一个值给了Requet.auth
    - 如果认证失败,抛出异常,APIException或者AuthenticationFailed

ps:从源码中看出,如果有多个认证,要将返回有两个值的放到最后(认证流程见参考网址)

  • 认证demo
### models.py

# 用户
class User(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)

# token
class UserToken(models.Model):
    token = models.CharField(max_length=64)
    user = models.OneToOneField(to='User')

......
## your_app.auth.py

# 用户登录之前,校验token是否正确(即请求到LoginView之前,先经过这个认证类校验,通过了请求才到LoginView)
class MyAuthentication(BaseAuthentication):
    # 须重写
    def authenticate(self, request):
        """
        如果认证通过,返回两个值 request.user和request.auth;
        如果认证失败,抛出AuthenticationFailed异常
        """
        # token = request.query_params.get('token')
        token = request.data.get('token')
        if token:
            user_token = models.UserToken.objects.filter(token=token).first()
            if user_token:
                return user_token.user, token # 正确就返回user和token
            else:
                raise AuthenticationFailed('认证失败')
        else:
            raise AuthenticationFailed('请求地址中需要携带token')

## views
# 如果请求能来到这边,说明自定义 MyAuthentication 校验无误
class LoginView(APIView):

    authentication_classes = [MyAuthentication,] # 局部配置
    # uthentication_classes = []

    def post(self, request):
        username = request.data.get('username')
        password = request.data.get('password')
        user_obj = User.objects.filter(username=username, password=password).first()
        if user_obj:
            token_num = str(uuid.uuid4())
            # 登录成功以后,更新token
            UserToken.objects.update_or_create(defaults={'token': token_num}, user=user_obj)
            return Response({'status': 100, 'msg': '登陆成功', 'token': token_num})
        else:
            return Response({'status': 101, 'msg': '用户名或密码错误'})
  • 全局配置如下
......
# ---------DRF配置--------------------#
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ["apps.tests.auth.MyAuthentication"]
}
......
class LoginView(APIView):

    # authentication_classes = [MyAuthentication,] # 局部配置
    authentication_classes = [] # 或者 authentication_classes 不写

标签:models,request,认证,token,user,password,DRF
From: https://www.cnblogs.com/qinganning/p/16998966.html

相关文章

  • 麒麟软件完成浪潮信息澎湃技术兼容性认证
    ​近日,麒麟软件银河麒麟高级服务器操作系统V10与浪潮M6系列主流11款服务器完成并通过澎湃技术测试认证,双方兼容性良好,系统整体运行稳定。澎湃技术认证是浪潮信息基于自身多......
  • 认证管理(锐捷无线篇)
    大家好,我是小杜。冬至到了,今天减少一点学习时间,主要给大家说说无线产品的几个常见的认证方式吧!一、外置/内置WEB认证Web认证是一种对用户访问网络的权限进行控制的身份认证......
  • drf系列-序列化
    一定义篇目的:用于获取需求models序列化的字段,字段必须在modles对应表内进行定义定义方式:#定义class类class(model_name)+Serializer(serializers.ModelSerializer):......
  • 认证管理(锐捷无线篇)
    大家好,我是小杜。冬至到了,今天减少一点学习时间,主要给大家说说无线产品的几个常见的认证方式吧!一、外置/内置WEB认证Web认证是一种对用户访问网络的权限进行控制的......
  • python 登录sftp 2FA 双因素认证登录(password+key)
    importosimportthreadingimportparamikoimportthreadpoolimporttimedefcreat_path(Dir):#localPath=filePath.rpartition("/")[0]ifnotos.path.exists(......
  • ISO认证常见的八大认证体系
    ISO认证大家应该都不陌生,即便之前没有接触过,但是也听到周边的人介绍或者是提及过,还有我们经常接触到的一些商品,都是经过ISO认证的。关于iso的认证问题,并不仅仅只是单独的一......
  • 通过GitHub和阿里云自定义域名实现https认证
    在GitHub中的操作登录GitHub,点击“Yourrepositories”,进入个人仓库页面;点击“new“,进入新建仓库页面;仓库名称填写<username>.github.io,<username>就是GitHub的账......
  • .NET Core如何通过认证机制访问Kafka?
    大家好,我是Edison。最近有一个ASP.NETCore使用认证机制访问Kafka的需求,加之我们又使用了CAP这个开源项目使用的Kafka,于是网上寻找了一番发现对应资料太少,于是调查了一番,......
  • drf框架时间处理问题
    问题:时间显示多个T和毫秒等,不是中国人常用的时间格式解决方法:第一种:全局配置在settings.py的REST_FRAMEWORK下配置(全局生效)REST_FRAMEWORK={#时间格式配置......
  • OpenHarmony应用集成AGC认证服务实现登录
    11月4日在HDC大会(华为开发者大会2022)推出一套覆盖应用设计、开发、测试、上架、运营全生命周期的七大鸿蒙开发套件“金字塔”,本次分享内容围绕处于“塔尖”位置的一站式鸿......