rest-framework实现用户认证
一、创建数据模型
1、创建一个用户表
class UserModel(models.Model): """ 创建一个用户表 """ user_type_choices = ( (1, '普通用户'), (2, 'VIP用户') ) user_type = models.IntegerField(choices=user_type_choices, null=False, verbose_name='用户类型') username = models.CharField(max_length=100, null=False, verbose_name='用户名') password = models.CharField(max_length=100, null=False, verbose_name='密码')
2、创建
token
表class UserTokenModel(models.Model): """ 创建一个用户token表 """ user = models.OneToOneField(to='UserModel', on_delete=models.CASCADE) token = models.CharField(max_length=100, verbose_name='用户token')
3、生成表
- 4、手动插入两条数据
二、原生的用户登录拦截(和第四章的session
差不多)
1、进行
token
认证class OrderView(APIView): def get(self, request, *args, **kwargs): res = {'code': 0, 'message': 'success'} token = request.GET.get('token', None) if token and models.UserTokenModel.objects.filter(token=token).first(): try: res['data'] = {'name': '哈哈'} except Exception as e: print(e) else: res['code'] = 1 res['message'] = '失败' return JsonResponse(res)
三、局部使用rest-framework
的认证模块
1、导包
from rest_framework.authentication import BasicAuthentication from rest_framework import exceptions
2、认证类
class Authentication(BasicAuthentication): def authenticate(self, request): token = request.GET.get('token', None) token_obj = models.UserTokenModel.objects.filter(token=token).first() if not token_obj: raise exceptions.AuthenticationFailed('用户认证失败') return (token_obj.user, token_obj)
3、使用认证类(在需要认证的视图中写上)
class OrderView(APIView): authentication_classes = [Authentication] def get(self, request, *args, **kwargs): # 因为上面认证类中返回了,这里可以直接获取到 print(request.user.username) print(request.auth) res = {'code': 1, 'message': '失败', 'data': None} try: res['data'] = {'name': '哈哈'} except Exception as e: print(e) return JsonResponse(res)
4、总结:
- 1.上面认证类中返回的用户相关信息,我们可以在别的请求中直接在
request
中取到 - 2.可以在需要限制访问的接口中加上这个类,来限制登录访问
- 1.上面认证类中返回的用户相关信息,我们可以在别的请求中直接在
四、全局注册
1、说明:类似函数的作用域一样的,如果局部有就用局部的,如果局部没有就用全局的
2、把刚刚定义的认证类单独定义到一个包下面
3、在
settings.py
中使用restframework
的配置REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ['你定义认证类的路径'] }
- 4、你局部可以不需要配置了,如果配置就使用局部的认证类
5、在全局上配置了认证,但是有些接口不需要认证的时候就在接口视图中写上一个空的列表
class OrderView(APIView): authentication_classes = [] def get(self, request, *args, **kwargs): pass
五、未认证身份的配置
- 1、可以使用
UNAUTHENTICATED_USER
设置修改未经身份验证的请求的request.user
的值 - 2、可以使用
UNAUTHENTICATED_TOKEN
设置修改未经身份验证的请求的request.auth
的值 3、在
settings.py
中配置REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ['你定义认证类的路径'], 'UNAUTHENTICATED_USER': None, 'UNAUTHENTICATED_TOKEN': None, }