DRF之自定义认证类
2019-05-26 本文已影响0人
清风徐来_简
- LoginView中:用户登录就对应用户生成token存入对应关系表
user = User.objects.filter(user=user,pwd=pwd).first() # 看看有没有此用户 import uuid # 此模块用来生成随机字符串 random_str= uuid.uuid4() if user: # 是更新还是创建取决于user有没有,如果有就更新,没有就创建 UserToken.objects.update_or_create(user=user,defaults={'token':random_str}) response['user'] = user.user # 将用户名返回,可能有用 response['token'] = random_str return Response(response)
- 自定义认证类:根据用户token表查看是否通过认证
from rest_framework.exceptions import AuthenticationFailed from app01.models import UserToken class UserAuth(): # 【认证第一步】 def authenticate_header(self, request): # 这个方法必须有 pass def authenticate(self, request): token = request.query_params.get('token') usertoken = UserToken.objects.filter(token=token).first() # token对象 if usertoken: # 如果用户登录了 return usertoken.user, usertoken.token # 此句话赋值给self.user,也就是request.user # 通过token值,找到user对象,并赋值给request。 # 因为这只是访问的第一步,第二部还要根据用户的身份进行不同的展示。 # 而第二步是走到第一步的毕竟之路,所以想让第二步有user对象,可以通过第一步完成之后把user对象赋值给request # 当然还可以自己通过token值查找用户,相对来说会比较麻烦。 else: # 用户没登录就得抛错 raise AuthenticationFailed('认证失败!') # 这就限制了用户只有登录之后才能访问
- 用的时候:
from app01.authentication_classes import UserAuth class BookView(APIView): authentication_classes = [UserAuth] # 【认证第二步】 def post(self, request): pass def get(self, request): pass
- 登录认证流程:
- 用户输入 账号(唯一) 和 密码 之后,走login函数,函数去数据库查询,如果有查询结果,证明存在,就随机生成一个 uuid4() 的字符串,存进与之一一对应的 usersession 表中。并且将这个字符串返回给前端。
- 前端再次访问时带着字符串访问。后端进行验证。
- 验证的时候通过 usersession 验证,如果有就通过,正常访问,如果没有就拒绝访问。
-
自定义认证类流程:
- 定义的时候就是自定义一个类
class UserAuth(BaseAuthentication)
, - 这个类继承
BaseAuthentication
, - 定义一个
authenticate
方法, - 进行认证,如果认证通过就可以
返回两个值
, - 认证不通过,就抛一个
AuthenticationFailed
错误, - 使用时就在视图函数中指定
authentication_classes= [UserAuth]
- 定义的时候就是自定义一个类