1. 什么是 drf 框架的认证组件: auth 就等于是 jango 中的 Auth 模块, Auth 是自带 session 信息, 但是 drf 的认证组件可以自定义 token 携带过去, 去判断用的
2. 如何实现认证呢?
- from rest_framework.authentication import BaseAuthentication
- from app01 import models
- from rest_framework.exceptions import AuthenticationFailed
- class MyAuthetication(BaseAuthentication):
- #重写这个方法
- def authenticate(self,request):
- #认证相关的东西
- #如果 token 信息放到请求头中, 如何取?
- # request._request.META
- # token=request.META.get('token')
- # 校验该次请求是否携带正确的 token
- #取出 token
- token=request.GET.get('token')
- #校验该次请求是否携带正确的 token
- ret=models.UserToken.objects.filter(token=token).first()
- if ret:
- #正常通过认证的用户
- #ret.user 当前登录用户
- return ret.user,token
- # return None
- else:
- #没有登录或者非法用户
- raise AuthenticationFailed('您没有通过认证')
判断用户登录携带的 token 是否正确
3. 如何在登录的时候加载认证信息处理是否是正常的用户
- # 写登录接口
- class Login(APIView):
- #全局使用的局部禁用
- authentication_classes = []
- def post(self,request):
- response={'status':100,'msg':None}
- name=request.data.get('name')
- pwd=request.data.get('pwd')
- #去数据库校验该用户是否存在
- user=models.User.objects.filter(name=name,pwd=pwd).first()
- if user:
- #正常用户登录成功
- #返回一个唯一的随机字符串
- token=uuid.uuid4()
- #把生成的随机字符串存到数据库中
- # 这样不行, 因为每次登录都会新插入一条
- # models.UserToken.objects.create(user=user,token=token)
- # 先去数据库中查询, 如果当前用户存在记录, 更新 token, 如果不存在, 新增一条
- # 根据 user 取查询, 如果查到数据, 更新 defaults 中的数据, 如果查不到, 新增一条数据
- ret=models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
- response['msg']='登录成功'
- response['token']=token
- else:
- #用户名或密码错误
- response['status'] = 101
- response['msg'] = '用户名或密码错误'
- return Response(response)
简单的登录加载认证处理
4. 如何全局使用呢?
- # 认证的全局配置
- REST_FRAMEWORK={
- 'DEFAULT_AUTHENTICATION_CLASSES':['app01.MyAuth.MyAuthetication',],
- }
5. 如何全局禁用, 局部使用呢?
- # 写登录接口
- class Login(APIView):
- #全局使用的局部禁用
- authentication_classes = [MyAuthetication]
- def post(self,request):
来源: http://www.bubuko.com/infodetail-3038428.html