Django-rest-framework 接口实现 认证:(auth | authentication)
认证:(auth | authentication)
REST framework 提供了一些开箱即用的身份验证方案,并且还允许你实现自定义方案。
在 rest_framework.authentication 中 查看 认真方案
方案的 基类from rest_framework.authentication import BaseAuthentication
- 基于用户名密码的 认证
BasicAuthentication(BaseAuthentication)- 基于Session的认证
SessionAuthentication(BaseAuthentication)
- 基于Token 的认证
TokenAuthentication(BaseAuthentication)
- 基于远程用户的认证(专用用户管理服务器)
RemoteUserAuthentication(BaseAuthentication)
认证的流程
rest_framework 中的
在APIView 的 dispatch() 方法 执行 了 和 普通djando 不一样的方法
self.initial(request,*,**)方法 中 添加了新动作 (版本号的获取,认证,权限,频率限制)顺序 先认证 再权限 再限制
认证
self.perform_authentiction(request)
权限
self.check_permissions(request)
限制
self.check_throttles(request)
自定义认证 token
- 创建一个APP 将所有的 版本控制 认证 权限 与 主业务 区分开
定义一个类继承 BaseAuthentication 基于Token的认证
注意:
不做认证 就不会有 request.user 个人用户信息
重写 authenticte() 方法 通过 request.query_params.get('token') 获取 token 参数
通过认证必须返回两个参数 第一个是用户的 queryset 对象 第二个是token 值 元组的形式
错误或异常 需要抛出
AuthenticationFailed错误
# 所有 认证 的 父类
from rest_framework.authentication import BaseAuthentication
from auth_demo import models
# 不通过认证 需要抛出的 字段错误
from rest_framework.exceptions import AuthenticationFailed
class LoginAuth(BaseAuthentication):
重写父类的 authenticte 方法 认证信息携带在 params 路由参数中
def authenticate(self, request):
token = request.query_params.get('token')
if token:
# 如果请求的URL中携带了token参数
user_obj = models.UserInfo.objects.filter(token=token).first()
if user_obj:
# token是有效的
return user_obj, token # request.user, request.auth
else:
raise AuthenticationFailed('无效的token')
else:
raise AuthenticationFailed('请求的URL中必须携带token参数')
操作流程:
创建用户表 认证登录操作 最好额外创建APP
from django.db import models
class UserInfo(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
# token 设置为可以为空 查询时可以为空的字段 有时注册了但没有登录
token = models.CharField(max_length=128, null=True, blank=True)创建 注册需要的 接口
127.0.0.1:8000/user/register/# 一级路由
from django.conf.urls import url, include urlpatterns = [
url(r'^users/', include('auth_demo.urls')),
] # 二级路由
from django.conf.urls import url, include
from auth_demo import views
urlpatterns = [
url(r'^register/$', views.RegisterView.as_View()),
]创建注册的视图类 Register
from rest_framework.views import APIView
from rest_framework.response import Response
from auth_demo import models
class RegisterView(APIView):
''' 注册用户的试图 只提供 post 请求 '''
def post(self, request):
# 获取 用户名密码
name, pwd = request.data.get('name'), request.data.get('pwd')
# 可以做一些 账号密码的 限制
if name and pwd:
models.UserInfo.objects.create(name=name,pwd=pwd)
return Response('创建成功')
else:
return Response('无效的参数')登录之后使用
uuid.uuid1().hex生成token 保存到数据库中使用 update_or_create 方法 有就更新 没有就新增
class LoginView(APIView):
def post(self, request):
name = request.data.get('name')
pwd = request.data.get('pwd')
if name and pwd:
user_obj = models.UserInfo.objects.filter(name=name, pwd=pwd).first()
if user_obj:
# 登陆成功
# 生成token(时间戳 + Mac地址)
token = uuid.uuid1().hex
# 1.保存在用户表中
user_obj.token = token
user_obj.save()
# 2.给用户返回
return Response({'error_no': 0, 'token': token}) else:
# 用户名或密码错误 通过 error_no 来判断请求是否成功
return Response({'error_no': 1, 'error': '用户名或密码错误'})
else:
return Response('无效的参数')
将认证的 类添加到 配置项中
全局配置
# 后面的 权限 是基于 认证的 所以全局一定要配置 权限
REST_FRAMEWORK = {
# 自定义的 认证
# 'DEFAULT_AUTHENTICATION_CLASSES': ['auth_demo.auth.MyAuth', ],
# 使用 rest_framework 给出的认证
# 'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentiction.TokenAuthentication', ]
# 限制比较宽松的认证
'DEFAULT_AUTHENTICTION_CLASSES': []
}
局部配置
# 写在单独的试图中
authentication_classes = [MyAuth, ]
Django-rest-framework 接口实现 认证:(auth | authentication)的更多相关文章
- Django Rest framework 框架之认证使用和源码执行流程
用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...
- Django REST framework 自定义(认证、权限、访问频率)组件
本篇随笔在 "Django REST framework 初识" 基础上扩展 一.认证组件 # models.py class Account(models.Model): &qu ...
- Django REST framework 之JWT认证
Json Web Token 1.JWT简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.JWT 可以使用 H ...
- Django REST framework 之 API认证
RESTful API 认证 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权 ...
- Django REST framework 的TokenAuth认证及外键Serializer基本实现
一,Models.py中,ForeignKey记得要有related_name属性,已实现关联对象反向引用. app_name = models.ForeignKey("cmdb.App&q ...
- Django REST framework基础:认证、权限、限制
认证.权限和限制 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制.然后 权限 和 限制 组件决定是否拒绝这个请求. 简单来说就是: 认证确定了你是谁 权限确定你能不 ...
- django rest framework权限和认证
Django rest framework之权限 一.Authentication用户认证配置 1.四种验证及官网描述: BasicAuthentication 此身份验证方案使用HTTP基本身份验证 ...
- Django自带的用户认证auth模块
一.介绍 基本上在任何网站上,都无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能. 使用Django,我们可以不需要自己写这些功能,因为Dj ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证
#settings.py """ Django settings for AutoCmdb project. Generated by 'django-admin sta ...
随机推荐
- C# 操作注册表WindowsRegistry
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsof ...
- C#基础知识总结(一)
这个基础知识系列是我自己对基础知识的一个巩固和总结,在复习的过程中对细节知识点加深印象,可能其中有错误之处,请大家批评指正,谢谢.希望和大家共同学习共同进步. 摘要 这个系列一篇总结了:C#程序的结构 ...
- element UI table 过滤 筛选问题
一.问提描述 使用elementUI table 官方筛选案例,发现筛选不是服务器端筛选,而是浏览器端对每一页进行单独筛选. 如何在服务器端筛选? 二.查询Element UI 官网table组 ...
- Java_IO流_抽象类
一. 概念 流动,从一端流向另一端,源头与目的地 以程序为中心,程序与 数组/文件/网络连接/数据库, 二. io流分类 流向:输入流与输出流 数据 :字节楼:二进制,所有文件都可以操作,包括 ...
- JSTL_Format标记库
JSTL_Format 一:JSTL Format标记库 如有转载,请标明出处 介绍标记属性的时候,按照顺序必须写的->带有默认值的->其他的,中间用回车隔开 在jsp问价开头加上 < ...
- [JavaScript]手机滑动图片
思路 1.用ul ,li 来装载滑动的图片,超出部分隐藏 2.滑动是通过改变ul的位置来实现 布局 模块 1: 根据li元素个数去设置ul的宽度 1.1 获取ul元素 1.2 获取li元素的个数 1. ...
- 中文汉字和常见英文数字等的unicode编码范围
- 关于bug的一些思考
上午看了两道算法,自己编译器上面敲了一遍,然后又去网站上敲了一遍: 编译器上面无论哦如何都调不出来,网站上面也是: 吃个午饭,睡个觉,醒来重新手撸了一遍,然后就过了 : 面对这种事情,真的是自己应该多 ...
- python LeetCode 两数相除
近一个月一直在写业务,空闲时间刷刷leetcode,刷题过程中遇到了一道比较有意思的题目,和大家分享. 题目描述: 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使 ...
- Scala之Calendar,SimpleDateFormat简单用法
package com.dingxin.entrance import java.text.SimpleDateFormat import java.util.{Calendar, Date} /** ...