一、认证组件的介绍
对于认证,我们一般有三种方式,即cookie, session,token,
- cookie,是将信息存放在客户端(浏览器上),信息不安全;
- session,把信息放在服务器数据库中,但是要是信息量较大,对服务器的压力就会大大增加;
- token采用每次用户登陆后为其设置一个随机字符串,即token值,用户登陆之后,每次访问都带着这个token来访问,服务端只需要验证token值是否正确就可以,相对比较方便使用;
所以,我们使用token做认证;
二、认证组件的使用
首先需要编写模型类这里已经准备好了,主要是需要user表与token表。
class User(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32) level = ( (1, 'delux'), (2, 'vip'), (3, 'svip') ) user_level = models.IntegerField(choices=level) class UserToken(models.Model): token = models.CharField(max_length=128) user = models.OneToOneField('User', on_delete=models.CASCADE)
然后需要编写登陆视图
class Loginview(APIView): # parser_classes = [JSONParser, FormParser] def get(self, request): return render(request, 'login.html') def post(self, request): ''' code: 200:登陆成功 201:用户名或密码错误 202:其他错误 :param request: :return: ''' res = {'code': None, 'user': None, 'message': None} try: username = request.data.get('username') password = request.data.get('password') user_obj = User.objects.filter(username=username, password=password).first() if user_obj: token_str = str(uuid.uuid4()).replace('-', '') UserToken.objects.update_or_create(user=user_obj, defaults={'token': token_str}) res['code'] = '200' res['user'] = username res['message'] = '登陆成功' res['token'] = token_str else: res['code'] = '201' res['message'] = '用户名或密码错误' except Exception as e: res['code'] = '202' res['message'] = e # print(request.data) # print(self.parser_classes) # res['succsess'] = request.data # res = json.dumps(res) return Response(res)
准备工作做好之后我们来编写认证类,在编写之前需要导入相关的包与模型类
from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import AuthenticationFailed
from app01.models import UserToken # model中的模型类
开始编写认证类,
class UserAuth(BaseAuthentication): def authenticate(self, request): # 我们模仿get请求页面 token = request.query_params.get("token") # 同request.GET.get("token") # 在token表中查找有么有这次请求携带的token值 user_token_obj = models.UserToken.objects.filter(token=token).first() if user_token_obj: # 如果有值,说明是 正常用户 return user_token_obj.user, user_token_obj.token # 返回 当前的用户对象,和当前的token值,这样源码就会帮我们赋值给request对象了,我们在后面的request中就可以使用了 else: raise AuthenticationFailed("认证失败!")
视图类中只需要加入一行代码
authentication_classes = [UserAuth] # 认证类
这样我们的认证组件就完成了。