DRF的认证

Posted zwq-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DRF的认证相关的知识,希望对你有一定的参考价值。

一、概述

认证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制。然后 权限 和 限制 组件决定是否拒绝这个请求。

简单来说就是:

认证确定了你是谁

权限确定你能不能访问某个接口

限制确定你访问某个接口的频率

二、认证

REST framework 提供了一些开箱即用的身份验证方案,并且还允许你实现自定义方案。

技术分享图片

自定义Token认证

model 定义一个包含token字段的用户表

class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    vip = models.BooleanField(default=False)
    token = models.CharField(max_length=128, null=True, blank=True)

定义登录视图:

class LoginView(APIView):
    def post(self, request):
        name = request.data.get(name)
        pwd = request.data.get(pwd)
        if name and pwd:
            user_obj = models.UserInfo.objects.filter(name=name, pwd=pwd).first()
            if user_obj:
                # 登陆成功
                # 生成token(时间戳 + Mac地址)
                token = uuid.uuid1().hex
                # 1.保存在用户表中
                user_obj.token = token
                user_obj.save()
                # 2.给用户返回
                return Response({error_no: 0, token: token})

            else:
                # 用户名或密码错误
                return Response({error_no: 1, error: 用户名或密码错误})
        else:
            return Response(无效的参数)

创建auth.py自定义一个认证类

from rest_framework.authentication import BaseAuthentication
from auth_demo import models
from rest_framework.exceptions import AuthenticationFailed


class MyAuth(BaseAuthentication):
    ‘‘‘自定义认证类‘‘‘

    def authenticate(self, request):
        token = request.query_params.get (token)
        if token:
            # 如果请求url中携带有token参数
            user_obj = models.UserInfo.objects.filter(token=token).first()
            if user_obj:
                # token 是有效的,返回一个元组
                return user_obj, token  # request.user, request.auth
            else:
                raise AuthenticationFailed(无效的token)
        else:
            raise AuthenticationFailed(请求的URL中必须携带token参数)

局部配置认证

在views中自定义一个测试类TestAuthView

from auth_demo.auth import MyAuth
from auth_demo.permissions import MyPermission
# 登录之后才能看到数据接口
class TestAuthView(APIView):
    authentication_classes = [MyAuth, ]  # 局部配置认证

    def get(self, request):
        print(request.user.name)
        print(request.auth)
        return Response(这个视图里面的数据只有登录后才能看到!)

全局配置认证

# 在settings.py中配置
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ["auth_demo.auth.MyAuth", ] 
}

 

以上是关于DRF的认证的主要内容,如果未能解决你的问题,请参考以下文章

DRF教程7-认证

Drf03 / drf版本认证权限

79- drf三大认证的配置及使用方法

drf 三大认证详解

drf——认证

drf之三大认证