django-restframework之接口认证

39 篇文章 1 订阅
18 篇文章 0 订阅

之前我们把API接口做好了,可以实现增删改查了
但是有一个问题
那就是这接口传过去的数据,谁都可以访问到
这并不安全也并不是我们想要的
比如说有些数据,我们可能只想让会员看到

于是,就需要对接口的访问对象进行认证:

在框架的底层其实已经实现了认证的代码
只不过在我们之前写的接口并没有调用,

上代码了:

class BookView(viewsets.ModelViewSet):
    authentication_classes = [UserAuth]
    queryset = Book.objects.all()
    serializer_class = BookSerialize

先在接口视图中调用 authentication_classes = [UserAuth]
定义接口认证类UserAuth
随后手写接口认证类

class UserAuth():
    def authenticate_header(self,request):
        pass

    def authenticate(self,request):
        token = request.query_params.get('token')
        try:
            token = UserToken.objects.get(token=token)
            return token.user,token.token
        except Exception:
            raise APIException('认证不通过')

authenticate方法就是完成我们认证逻辑的方法
虽然没有继承任何类
但是在底层调用的时候,从某种意义上讲
作用类似于重写认证方法

token就是用户验证的身份码
当验证不通过时
在这里插入图片描述
数据库模型:

class User(models.Model):
    user_types = ((1,'NOMAL'),
                 (2,'SVIP'),
                 (3,'VVIP'))
    username = models.CharField('用户名',max_length=22)
    password = models.CharField('密码',max_length=32)
    user_type = models.SmallIntegerField('用户级别',choices=user_types,default=1)


class UserToken(models.Model):
    user = models.OneToOneField(User,related_name='user_token')
    token = models.CharField('用户token',max_length=200)

当然,也不是一定非要用token作为验证
我们同样经常使用的cookie和session也可以作为判断的依据

当然,用APIView也可以实现,如果你觉得自己要求比较难以满足的话:

class Login(APIView):
    def post(self,request):
        fields = {'username','password'}
        data_set = set(request.data.keys())
        info = {}
        if fields.issubset(data_set):
            for k in fields:
                info[k] = request.data[k]
        user_instance = User.objects.filter(**info).first()
        response = {}
        if user_instance:
        #注意这里的defaults
            token = UserToken.objects.update_or_create(user=user_instance,defaults={
                'token':set_token()
            })  
            response['token'] = token[0].token
        else:
            response['error'] = '错了错了'
        return JsonResponse(response)

好了,就先写到这了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值