python测试开发django-rest-framework-61.权限认证(permission)
前言
用户登录后,才有操作当前用户的权限,不能操作其它人的用户,这就是需要用到权限认证,要不然你登录自己的用户,去操作别人用户的相关数据,就很危险了。
- authentication是身份认证,判断当前用户的登录方式是哪种认证方式
- permissions 是权限认证,判断哪些用户有操作权限
authentication身份认证
身份验证是将收到的请求和一组标识证书(如用户名密码、令牌)进行关联的一种机制,以便权限和策略可以根据这个标识证书来决定是否允许该请求。因此,身份验证发生在验证权限和限制检查之前。
当收到的请求通过身份验证时:
request.user属性会设置为django.contrib.auth.User对象,即我们登录的对象(我们定义用户继承于User)。
request.auth会设置为对应的Token(如果带有Token)或者None(如果不带有Token)。
当收到请求身份验证失败时:request.user属性会设置为django.contrib.auth.models.AnonymousUser对象。
request.auth会设置为None。
django rest framework权限和认证有四种方式:
- BasicAuthentication 此身份验证方案使用HTTP基本身份验证,根据用户的用户名和密码进行签名。基本身份验证通常仅适用于测试
- TokenAuthentication 此身份验证方案使用基于令牌的简单HTTP身份验证方案。令牌认证适用于客户端 - 服务器设置,例如本机桌面和移动客户端。
- SessionAuthentication 此身份验证方案使用Django的默认会话后端进行身份验证。会话身份验证适用于与您的网站在同一会话上下文中运行的AJAX客户端。
- RemoteUserAuthentication 此身份验证方案允许您将身份验证委派给Web服务器,该服务器设置REMOTE_USER 环境变量。
permission权限认证
权限检查通常使用request.user和request.auth属性中的身份验证信息来确定是否应允许传入请求。
当权限检查失败时,将根据以下规则返回HTTP 403 Forbidden或HTTP 401 Unauthorized:
- 如果收到的请求身份验证通过,但是权限验证失败,则返回HTTP 403 Forbidden;
- 如果收到的请求身份验证失败,且最高优先级验证类不能使用WWW-Authenticate请求头,则返回HTTP 403 Forbidden;
- 如果收到的请求身份验证失败,且最高优先级验证类可以使用WWW-Authenticate请求头,则返回HTTP 401 Unauthorized
权限级别也有四种
- AllowAny 允许所有用户
- IsAuthenticated 表示仅仅允许身份验证通过的用户访问,其他用户无法访问。
- IsAdminUser 表示仅仅允许管理员用户访问,普通用户无法访问。
- IsAuthenticatedOrReadOnly 表示仅仅允许身份验证通过的用户访问,或者只允许只读请求(GET请求)访问。
相关配置
在settings.py中,INSTALLED_APPS添加rest_framework和rest_framework.authtoken
INSTALLED_APPS = [
'apiapp',
'rest_framework.authtoken',
'rest_framework',
]
REST_FRAMEWORK添加权限认证方式和身份认证方式
REST_FRAMEWORK = {
# 权限认证
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated', # IsAuthenticated 仅通过认证的用户
'rest_framework.permissions.AllowAny', # AllowAny 允许所有用户
'rest_framework.permissions.IsAdminUser', # IsAdminUser 仅管理员用户
'rest_framework.permissions.IsAuthenticatedOrReadOnly', # IsAuthenticatedOrReadOnly 认证的用户可以完全操作,否则只能get读取
),
# 身份认证
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication', # token认证
)
}
登录生成token
登录的时候,不需要身份认证,permission_classes设置成AllowAny,允许所有的用户
permission_classes = (AllowAny,) # AllowAny 允许所有用户
from django.http import JsonResponse
from django.shortcuts import HttpResponse
from rest_framework.authtoken.models import Token
from django.contrib import auth
from rest_framework.views import APIView
from rest_framework import viewsets
from rest_framework import serializers
from .models import *
from django.http import QueryDict
from rest_framework.request import Request
from rest_framework.permissions import IsAuthenticated,AllowAny
from rest_framework.authentication import TokenAuthentication
'''作者:上海悠悠,QQ交流群:750815713'''
class LoginViewSet(APIView):
'''登录获取token方法'''
permission_classes = (AllowAny,) # AllowAny 允许所有用户
def post(self, request, *args, **kwargs):
username = request.data.get('username')
# print(username)
password = request.data.get('password')
user = auth.authenticate(username=username, password=password)
if not user:
return HttpResponse({"code": 0,
"msg": "用户名或密码不对!"})
# 删除原有的Token
old_token = Token.objects.filter(user=user)
old_token.delete()
# 创建新的Token
token = Token.objects.create(user=user)
return JsonResponse({"code": 0,
"msg": "login success!",
"username": user.username,
"token": token.key})
添加card相关信息,接着前面一篇讲的,添加authentication_classes和permission_classes
authentication_classes = (TokenAuthentication,) # token认证
permission_classes = (IsAuthenticated,) # # IsAuthenticated 仅通过认证的用户
def get_parameter_dic(request, *args, **kwargs):
# 作者:上海悠悠,QQ交流群:750815713
if isinstance(request, Request) == False:
return {}
query_params = request.query_params
if isinstance(query_params, QueryDict):
query_params = query_params.dict()
result_data = request.data
if isinstance(result_data, QueryDict):
result_data = result_data.dict()
if query_params != {}:
return query_params
else:
return result_data
class CardSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Card
fields = "__all__"
class CardViewSet(viewsets.ModelViewSet):
'''# 作者:上海悠悠,QQ交流群:750815713'''
authentication_classes = (TokenAuthentication,) # token认证
permission_classes = (IsAuthenticated,) # # IsAuthenticated 仅通过认证的用户
queryset = Card.objects.all()
serializer_class = CardSerializer
def get(self, request, *args, **kwargs):
params=get_parameter_dic(request)
return JsonResponse(data=params)
def post(self, request, *args, **kwargs):
params=get_parameter_dic(request)
return JsonResponse(data=params)
def put(self, request, *args, **kwargs):
params=get_parameter_dic(request)
return JsonResponse(data=params)
models.py设计card表
class Card(models.Model):
'''银行卡 基本信息 # 作者:上海悠悠,QQ交流群:750815713'''
card_id = models.CharField(max_length=30, verbose_name="卡号", default="")
card_user = models.CharField(max_length=10, verbose_name="姓名", default="")
add_time = models.DateField(auto_now=True, verbose_name="添加时间")
class Meta:
verbose_name_plural = '银行卡账户'
verbose_name = "银行卡账户_基本信息"
def __str__(self):
return self.card_id
urls.py添加方法地址
from apiapp import views
from django.conf.urls import url
from rest_framework import routers
from django.conf.urls import include
# 作者:上海悠悠,QQ交流群:750815713
router = routers.DefaultRouter()
router.register(r'cards', views.CardViewSet)
urlpatterns = [
url(r'^api/v1/login/$', views.LoginViewSet.as_view()),
url(r'^', include(router.urls)),
]
测试接口
先获取登录token,把token值复制出来:1c0debb44fa0054d312616e7000ae78ce396df8e
{
"code": 0,
"msg": "login success!",
"username": "test",
"token": "1c0debb44fa0054d312616e7000ae78ce396df8e"
}

访问添加银行卡账号的接口时,需在头部带上token,格式为
Authorization: Token 1c0debb44fa0054d312616e7000ae78ce396df8e
带上token去请求的时候,就可以正常的添加成功

查看数据库card表会有数据新增成功

如果token错误,或者没有token就会出现401 Unauthorized

python测试开发django-rest-framework-61.权限认证(permission)的更多相关文章
- python测试开发django-rest-framework-63.基于函数的视图(@api_view())
前言 上一篇讲了基于类的视图,在REST framework中,你也可以使用常规的基于函数的视图.它提供了一组简单的装饰器,用来包装你的视图函数, 以确保视图函数会收到Request(而不是Djang ...
- Django Rest framework 之 权限
django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...
- python测试开发django-36.一对一(OneToOneField)关系查询
前言 前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示.本篇继续学习一对一(OneToOneField)关系的查询. 上一篇list_d ...
- python测试开发django-16.JsonResponse返回中文编码问题
前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...
- python测试开发django-15.查询结果转json(serializers)
前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...
- 2019第一期《python测试开发》课程,10月13号开学
2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...
- 《Python测试开发技术栈—巴哥职场进化记》—前言
写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...
- python测试开发django-197.django-celery-beat 定时任务
前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...
- python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)
前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...
- 【python测试开发栈】python基础语法大盘点
周边很多同学在用python,但是偶尔会发现有人对python的基础语法还不是特别了解,所以帮大家梳理了python的基础语法(文中的介绍以python3为例).如果你已然是python大牛,可以跳过 ...
随机推荐
- 量化编程技术—matplotlib与可视化
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D np.random ...
- 最常见的Java面试题及答案汇总(六)
异常 74. throw 和 throws 的区别? throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理.而throw则是 ...
- strace调试工具编译移植
源码下载:https://github.com/strace/strace/releases/tag/v4.18(使用的较老版本,最新版 5.4 编译时依赖较多,最终博主放弃使用) [ 编译步骤 ] ...
- Windows10无法访问局域网文件夹
给目录guest用户,并启用guest 最近硬盘存储不开资料在同学的电脑存储了然后使用Windows提供的共享文件夹功能提供文件访问,可是今天上午一不小心把系统玩挂了重新安装了Windows10专业工 ...
- Django-05-视图函数
http请求中产生两个核心对象: http请求:HttpRequest对象 http响应:HttpResponse对象 所在位置:django.http 之前我们用到的参数request就是HttpR ...
- Django框架之DRF APIView Serializer
一.APIView 我们在使用DjangoRestfulFramework的时候会将每个视图类继承APIView,取代原生Django的View类 APIView的流程分析: rest_framewo ...
- Python之路【第二十三篇】:数据库基础
数据库的简介 数据库 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩展性, ...
- Java11新特性 - 标准Java异步HTTP客户端
Java9开始引入的一个处理 HTTP 请求的的 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到这个 AP ...
- .NET Core的SqlSugar上手使用小例子
开始直接建个空的WEB项目-建Controllers文件夹-开启MVC-添加NuGet程序包SqlSugarCore public class Startup { // This method get ...
- 在Centos7中创建.net core 项目,并用Apache做代理服务器部署.net core项目
这一篇实例记录一次用Centos7创建并部署.net core项目的过程,希望能帮到用到的小伙伴. Kestrel 是 ASP.NET Core 项目模板中包括的默认 Web 服务器,Kestrel可 ...