首页 > 其他 > 详细

DRF的认证

时间:2019-01-16 20:11:12      阅读:235      评论:0      收藏:0      [点我收藏+]

一、概述

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

简单来说就是:

认证确定了你是谁

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

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

二、认证

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的认证

原文:https://www.cnblogs.com/zwq-/p/10274204.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!