4:Django-DRF-认证

认证

rest_framework给我们提供了认证的接口,由BaseAuthentication类提供接口,也有一些封装好的认证类(请走入源码....)

接口函数 authticate 认证成功返回一元组(user,token)分别赋值给request.user 和 request.token

认证规则:

​ 认证组件:校验用户 - 游客、合法用户、非法用户
​ 游客:代表校验通过,直接进入下一步校验(权限校验)
​ 合法用户:代表校验通过,将用户存储在request.user中,再进入下一步校验(权限校验)
​ 非法用户:代表校验失败,抛出异常,返回403权限异常结果
​ 只要通过认证不管是游客还是登录用户,request.user都有值

Django RESTFUL提供的认证一共有4种

我们只介绍三种,第四种RemoteUserAuthentication几乎不用,当然我们首先先来介绍这几种,看看他们有啥区别:

  • BasicAuthentication:此身份验证方案使用HTTP基本身份验证,根据用户的用户名和密码进行签名。基本身份验证通常仅适用于测试。
  • TokenAuthentication: 此身份验证方案使用基于令牌的简单HTTP身份验证方案。令牌认证适用于客户端 - 服务器设置,例如本机桌面和移动客户端。
  • SessionAuthentication: 此身份验证方案使用Django的默认会话后端进行身份验证。会话身份验证适用于与您的网站在同一会话上下文中运行的AJAX客户端。
  • RemoteUserAuthentication(不经常用,忘记):此身份验证方案允许您将身份验证委派给Web服务器,该服务器设置REMOTE_USER 环境变量。

说明:

  • BasicAuthentication:客户端用户名密码认证
  • TokenAuthentication:采用token值进行校验
  • SessionAuthentication:采用sessionid的方式进行校验。

下面是一个简单的认证示例

class Auth(BaseAuthentication):
    """
    继承于BaseAuthentication认证类
    """
    def authenticate(self, request):
        # print(request.method)
        if request.method in ["POST","PUT","DELETE"]:
            # 如果请求是post,put,delete三种类型时
            # 获取随用户请求发来的token随机码
            token = request.data.get("token")
            # 然后去数据库查询有没有这个token
            token_obj = models.Token.objects.filter(token=token).first()
            if token_obj:
                # 如果存在,则说明验证通过,以元组形式返回用户对象和token
                return token_obj.user,token
            else:
                # 不存在就直接抛错
                raise AuthenticationFailed("无效的token")
        else:
        # 这一步的else 是为了当用户是get请求时也可获取数据,并不需要验证token.
            return None,None

    def authenticate_header(self, request):
        pass
    
class OrderView(APIView):
    #局部认证
    authentication_classes = [Auth]
    def get(self,request):
        return HttpResponse('用户信息')

我们的认证类可以放在局部视图函数,也可以配置为全局认证。

局部视图函数认证:

class MyView(APIView):
    # 只需要在视图里单独加上认证类即可
    authentication_classes = [Auth]
    pass

全局配置 在settings.py 的路径

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': ['app.utils.Authuser.Auth'],
     "UNAUTHENTICATED_USER":lambda :"匿名用户",
    "UNAUTHENTICATED_USER":None, # 匿名,request.user = None
    "UNAUTHENTICATED_TOKEN":None,# 匿名,request.auth = None
}

豁免认证

class OrderView(APIView):
    #豁免认证
    # 当前视图不使用认证
    authentication_classes = []
    def get(self,request):
        return HttpResponse('用户信息')

认证返回值

  # raise Exception(), 不在继续往下执行,直接返回给用户。
  # return None ,本次认证完成,执行下一个认证
  # return ('x',"x"),认证成功,不需要再继续执行其他认证了,继续往后权限、节流、视图函数
posted @ 2021-06-17 15:32  IT小码农!!!!  阅读(51)  评论(0)    收藏  举报