django rest framework 用户认证
2018-10-20 13:29
1146 查看
BaseAuthentication 类: django rest framework 通过 BaseAuthentication 实现认证功能 无论是自定义的认证类还是 rest framework 自带的认证类都应该继承 BaseAuthentication BaseAuthentication 中有两个方法 authenticate 和 authenticate_header, 其中 authenticate 方法必须实现 如果用户需要自定义认证方法则继承 BaseAuthentication 重写 authenticate 方法即可
models.py
from django.db import models class UserInfo(models.Model): user_type_choices = ( (1, '普通用户'), (2, 'VPI'), (3, 'SVPI'), ) user_type = models.IntegerField(choices=user_type_choices) username = models.CharField(max_length=32, unique=True) password = models.CharField(max_length=64) class UserToken(models.Model): user = models.OneToOneField('UserInfo', models.CASCADE) token = models.CharField(max_length=64)
APP_DIR/utils/auth.py # 在和 views.py 同级的目录创建 utils 包, 在 utils 中创建 auth.py 文件, 将认证相关的代码放入其中
from rest_framework import exceptions from rest_framework.authentication import BaseAuthentication from app01 import models # 实现自定义的认证类 class Authtication(BaseAuthentication): def authenticate(self, request): # 这儿的 request 对象不是 django 原生的 request 而是 rest_framework 内部进行封装过的 request # 使用 request._request 调用 django 原生的 request 对象 token = request._request.GET.get('token') # 检查用户的 token 是否合法 token_obj = models.UserToken.objects.filter(token=token).first() if not token_obj: # rest_framework 会在内部捕捉这个异常并返回给用户认证失败的信息 raise exceptions.AuthenticationFailed('用户认证失败') # 在 rest_framework 内部会将这两个字段赋值给request以供后续调用 return (token_obj.user, token_obj)
views.py
from django.http import JsonResponse from rest_framework.views import APIView from app01.utils.auth import Authtication import hashlib import time # 生成 token 字符串 def md5(user): ctime = str(time.time()) m = hashlib.md5(bytes(user, encoding='utf-8')) m.update(bytes(ctime, encoding='utf-8')) return m.hexdigest() # 用户登录 class AuthView(APIView): def post(self, request): ret = {'code':1000, 'msg':None} try: user = request._request.POST.get('username') pwd = request._request.POST.get('password') obj = models.UserInfo.objects.filter(username=user, password=pwd).first() if not obj: ret['code'] = 1001 ret['msg'] = "用户名或密码错误" # 为登录用户创建token token = md5(user) #存在更新 不存在创建 models.UserToken.objects.update_or_create(user=obj, defaults={'token':token}) ret['token'] = token except: ret['code'] = 1002 ret['msg'] = '请求异常' return JsonResponse(ret) # 业务代码 class Order(APIView): # 注册自定义的认证类, 可以有多个, 从左到右进行认证匹配 authentication_classes = [Authtication,] def get(self, request): # request.user 这个值等于 Authtication 返回的元组的第一个值 # request.auth 这个值等于 Authtication 返回的元组的第二个值 ret = {'code':1000, 'msg':None, 'data':None} ret['data'] = '欢迎使用本系统' return JsonResponse(ret)
rest_framework 内置的认证类:
BasicAuthentication # 基于浏览器实现的 Basic 认证, ftp 使用网页登录时使用的就是 Basic 认证 SessionAuthentication # 基于 django 的 user.is_active 进行认证 TokenAuthentication # 简单的基于 token 的认证 RemoteUserAuthentication # 简单的远程用户认证实现
配置全局生效的认证类和匿名用户:
自定义的认证类如果每次都在指定的类中使用 authentication_classes 指定那么就有可能出现大量的重复代码 我们可以通过全局设置让指定的认证类对继承至 APIView 的所有类生效 settings.py REST_FRAMEWORK = { # 设置全局生效的认证类(可以有多个) # app01 为 django app 的名称 # utils 为 app 目录下面的 utils 目录(这个目录必须包含 __init__.py 文件) # auth 为 utils 目录下面的 auth.py 文件 # Authtication 为 auth.py 文件里面的 Authtication 类 # 这儿的设置其实就是使用 from ... import ... 的路径 'DEFAULT_AUTHENTICATION_CLASSES': ["app01.utils.auth.Authtication",], #匿名用户配置 'UNAUTHENTICATED_USER': None, # 设置匿名用户的用户名, 默认为 AnonymousUser, 使用 request.user 查看 'UNAUTHENTICATED_TOKEN': None, # 设置匿名用户的 token, 默认为 None, 使用 request.auth 查看 }
指定 View 类不使用全局的认证类:
在不使用全局认证类的 View 类中添加 authentication_classes = [] 或者 authentication_classes = ['xxxx'] # authentication_classes = [] 表示不使用认证 # authentication_classes = ['xxxx'], xxxx 表示当前类需要使用的认证类用于替换全局类
相关文章推荐
- Django自定义用户认证系统Customizing authentication
- django开发(3)-用户登录注册和认证
- 源码剖析Django REST framework的认证方式
- Django用户管理及认证
- Django中的用户认证
- 14:django 用户认证系统
- 转载django 用户认证系统
- Django自定义用户认证系统之自定义用户模型
- Django REST framework 的TokenAuth认证及外键Serializer基本实现
- Django 中的用户认证
- django学习笔记---文件上传,用户认证,单选框,复选框接受
- Django rest framework源码分析(1)----认证
- python2.0_day18_Django自带的用户认证模块的使用
- 基于Django用户认证系统详解
- [Django实战] 第3篇 - 用户认证(初始配置)
- Django自定义用户表替换默认用户表认证
- django rest framework中认证Authentication
- Django用户认证系统 authentication system----登陆访问限制@login_required
- Django 中的用户认证