django rest framework 用户认证

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 表示当前类需要使用的认证类用于替换全局类

原文地址:http://blog.51cto.com/hongchen99/2306783

时间: 2024-11-07 03:19:35

django rest framework 用户认证的相关文章

Django实战之用户认证系统

详情请交流  QQ  709639943 00.Python 从入门到精通 78节.2000多分钟.36小时的高质量.精品.1080P高清视频教程!包括标准库.socket网络编程.多线程.多进程和协程. 00.Django实战之用户认证系统 00.Django实战之企业级博客 00.深入浅出Netty源码剖析 00.NIO+Netty5各种RPC架构实战演练 00.JMeter 深入进阶性能测试体系 各领域企业实战 00.30天搞定大数据爬虫项目 00.零基础实战机器学学习 00.企业级实战

源码剖析Django REST framework的认证方式及自定义认证

源码剖析Django REST framework的认证方式 由Django的CBV模式流程,可以知道在url匹配完成后,会执行自定义的类中的as_view方法. 如果自定义的类中没有定义as_view方法,根据面向对象中类的继承可以知道,则会执行其父类View中的as_view方法 在Django的View的as_view方法中,又会调用dispatch方法. 现在来看看Django restframework的认证流程 Django restframework是基于Django的框架,所以基

Django 中的用户认证

Django 自带一个用户认证系统,这个系统处理用户帐户.组.权限和基于 cookie 的 会话.本文说明这个系统是如何工作的. 概览 认证系统由以下部分组成: 用户 权限:控制用户进否可以执行某项任务的二进制(是/否)标志. 组:一种为多个用户加上标签和权限的常用方式. 消息:一种为指定用户生成简单消息队列的方式. Deprecated in Django 1.2: 认证系统的消息部分将会在 Django 1.4 版中去除. 安装 认证系统打包在 Django 的 django.contrib

Django Rest Framework之认证

代码基本结构 url.py: from django.conf.urls import url, include from web.views.s1_api import TestView urlpatterns = [ url(r'^test/', TestView.as_view()), ] views.py: from rest_framework.views import APIView from rest_framework.response import Response from

Django rest framework 之认证

一.基于token进行用户认证 1.settings 先将rest_framework添加到settings的app里 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'api', #我

DRF Django REST framework 之 认证组件(五)

引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任何数据,有客户端请求,我即返回数据,简单方便,每一个http请求都是新的,响应之后立即断开连接. 而如今,互联网的世界发生了翻天覆地的变化,用户不仅仅需要跟其他用户沟通交流,还需要跟服务器交互,不管是论坛类.商城类.社交类.门户类还是其他各类Web站点,大家都非常重视用户交互,只有跟用户交互了,才能

【django后端分离】Django Rest Framework之认证系统之redis数据库的token认证(token过期时间)

1:登录视图 redis_cli.py文件: import redis Pool= redis.ConnectionPool(host='localhost',port=6379,decode_responses=True) 登录视图文件:import redisfrom utils.redis_cli import Pool    # 创建redis连接池 class UserLogin(APIView): """ 用户登陆认证: 登录成功更新token值,并且返回给前端,

2014-10-27 Django用户认证

Django自身带有用户认证的模块. 如图:account_login是用户自定义的函数. auth.authenticate(username=username,password=password)用于验证用户名和登录密码.若存在该用户名和密码则返回一个非空值. (注意:Django在admin后台的User中验证用户.若想取消该用户的登录权限,可点选该用户名并下拉页面将其属性值Active去掉勾选.) 可通过request.user获取用户名. auth.login(request,user

Django Rest Framework源码剖析(二)-----权限

一.简介 在上一篇博客中已经介绍了django rest framework 对于认证的源码流程,以及实现过程,当用户经过认证之后下一步就是涉及到权限的问题.比如订单的业务只能VIP才能查看,所以这时候需要对权限进行控制.下面将介绍DRF的权限控制源码剖析. 二.基本使用 这里继续使用之前的示例,加入相应的权限,这里先介绍使用示例,然后在分析权限源码 1.在django 项目下新建立目录utils,并建立permissions.py,添加权限控制: class MyPremission(obje