DRF之自定义认证类

  • LoginView中:用户登录就对应用户生成token存入对应关系表
    user = User.objects.filter(user=user,pwd=pwd).first()  # 看看有没有此用户
    import uuid  # 此模块用来生成随机字符串
    random_str= uuid.uuid4()
        if user:     # 是更新还是创建取决于user有没有,如果有就更新,没有就创建
             UserToken.objects.update_or_create(user=user,defaults={'token':random_str})
             response['user'] = user.user  # 将用户名返回,可能有用
             response['token'] = random_str
    return Response(response)
    
  • 自定义认证类:根据用户token表查看是否通过认证
    from rest_framework.exceptions import AuthenticationFailed
    from app01.models import UserToken
    
    class UserAuth():  # 【认证第一步】
        def authenticate_header(self, request):  # 这个方法必须有
            pass
    
        def authenticate(self, request):
            token = request.query_params.get('token')
            usertoken = UserToken.objects.filter(token=token).first()  # token对象
            if usertoken:  # 如果用户登录了
                return usertoken.user, usertoken.token  # 此句话赋值给self.user,也就是request.user
                # 通过token值,找到user对象,并赋值给request。
                # 因为这只是访问的第一步,第二部还要根据用户的身份进行不同的展示。
                # 而第二步是走到第一步的毕竟之路,所以想让第二步有user对象,可以通过第一步完成之后把user对象赋值给request
                # 当然还可以自己通过token值查找用户,相对来说会比较麻烦。
            else:  # 用户没登录就得抛错
                raise AuthenticationFailed('认证失败!')
    #  这就限制了用户只有登录之后才能访问
    
  • 用的时候:
    from app01.authentication_classes import UserAuth
    class BookView(APIView):
        authentication_classes = [UserAuth]  # 【认证第二步】
        def post(self, request):
            pass
        def get(self, request):
            pass
    
  • 登录认证流程:
    • 用户输入 账号(唯一) 和 密码 之后,走login函数,函数去数据库查询,如果有查询结果,证明存在,就随机生成一个 uuid4() 的字符串,存进与之一一对应的 usersession 表中。并且将这个字符串返回给前端。
    • 前端再次访问时带着字符串访问。后端进行验证。
    • 验证的时候通过 usersession 验证,如果有就通过,正常访问,如果没有就拒绝访问。
  • 自定义认证类流程
    • 定义的时候就是自定义一个类class UserAuth(BaseAuthentication)
    • 这个类继承BaseAuthentication
    • 定义一个 authenticate方法,
    • 进行认证,如果认证通过就可以返回两个值
    • 认证不通过,就抛一个 AuthenticationFailed 错误,
    • 使用时就在视图函数中指定 authentication_classes= [UserAuth]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 忙了一周了,也该抽点时间写点儿东西. 话不多说,书接上文(上文在哪儿?),开发项目中经常用到弹窗,比如,用户要退出...
    从心开始的我阅读 11,741评论 0 8
  • 五绝/柳绿人离 作者:心博、图片:网络 五更无困意,一夜未曾眠。 柳绿人离去,眼前来到年。
    心博1阅读 188评论 2 2
  • 世间最好的爱情是什么样子? 举案齐眉,心心相印 世间最好的友谊是什么样子? 知心密友,诗酒猖狂 世间最好的生活是什...
    Elaine的生活之道阅读 1,223评论 13 43
  • 和30年未见的同学相见,对方从假小子变成了美富婆
    封之之阅读 183评论 0 0
  • 相约起五更, 结伴向山行。 雾淡青峰远, 峦高雪晶莹。 雨来石乱走, 风过木齐鸣。 马快毡房近, 茶香碗莫停。
    华文生_289b阅读 94评论 0 1