REST framework(五) 认证组件

REST framework 的认证组件是在* APIView *dispatch 下执行的。跟着源码过了下,了解它的实现过程。
1
2
3
4
5
上图源代码中的self.authenticators就是一个认证组件类的一个列表,我们在接下来后面的自定义认证组件时,就要注意这里面的源代源内容,自定义类的类名可以自己起,而类中的方法名是有特定的名字authenticator。因为源代源中user_auth_tuple=authenticator.authenticate(self)已经固定了这个方法名。另外还要注意一点,如果列表中只有一个认证组件的话,可以返回一个元组,但如果是多个认证组件的话,就只能在最后一个自定义认证组件还回元组,或是都返回None。不然一有返回元组,就退出了for循环,接下来的认证组件都不会执行到。
6
7
到了这,就差不多里已经出来结果了,只需要分析self是谁,如果自己类中定义authentication_classes就是自定的,如果没有,就用默认的,我们接下来看看如果没有自定义的,REST framework 是如何执行到默认的认证组件。
8
9
这上面的两个组件就是默认的组件。
10

自定义一个认证组件:

from rest_framework.exceptions import AuthenticationFailed
class TokenAuth(AuthenticationFailed):
    def authenticate(self,request):
        token=request.GET.get('token',None)
        token_obj=UserToken.objects.filter(token=token).first()
        if token_obj:
            return token_obj.user.user,token_obj
        else:
            raise AuthenticationFailed('认证失败!')

    def authenticate_header(self, request):
        pass

如果继承BaseAuthentication类则不用定义authenticate_header


from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from api.models import UserToken

class LoginAuth(BaseAuthentication):

    def authenticate(self, request):
        token=request.GET.get("token")
        token_obj=UserToken.objects.filter(token=token).first()
        if token_obj:
            return token_obj.user,token_obj.token
        else:
            raise AuthenticationFailed("认证失败")
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值