一、概述
认证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制。然后 权限 和 限制 组件决定是否拒绝这个请求。
简单来说就是:
认证确定了你是谁
权限确定你能不能访问某个接口
限制确定你访问某个接口的频率
二、认证
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", ] }
原文地址:https://www.cnblogs.com/zwq-/p/10274204.html
时间: 2024-10-02 00:16:06