DRF的权限组件(源码分析)
(资料图片)
DRF的权限组件(源码分析)
1. 创建用户表
from django.db import models# Create your models here.class UserInfo(models.Model): role_choice = ((1, "CEO"), (2, "CTO"), (3, "CFO")) role = models.SmallIntegerField(verbose_name="类型", choices=role_choice, default=1) username = models.CharField(verbose_name="用户名", max_length=32) password = models.CharField(verbose_name="密码", max_length=32) token = models.CharField(verbose_name="TOKEN", max_length=64, null=True, blank=True)
2. 自定义权限类
from rest_framework.permissions import BasePermissionclass PermissionA(BasePermission): message = {"code": 1003, "data": "无权访问"} def has_permission(self, request, view): if request.user.role == 2: return True return False def has_object_permission(self, request, view, obj): return True
3. 视图函数中添加认证
- 局部配置(views.py)
class UserView(APIView): permission_classes = [PermissionA, ] # role权限 def get(self, request): ...
- 全局配置(settings.py)
REST_FRAMEWORK = { # 权限 "DEFAULT_PERMISSION_CLASSES": ["app01.permission.PermissionA", ]}
4. 多个权限类
当开发过程中需要用户同时具备多个权限(缺一不可)时,可以用多个权限类来实现。
权限组件内部处理机制:按照列表的顺序逐一执行 has_permission
方法,如果返回True,则继续执行后续的权限类;如果返回None或False,则抛出权限异常并停止后续权限类的执行。
# models.pyfrom django.db import modelsclass Role(models.Model): """ 角色表 """ title = models.CharField(verbose_name="名称", max_length=32)class UserInfo(models.Model): """ 用户表 """ username = models.CharField(verbose_name="用户名", max_length=32) password = models.CharField(verbose_name="密码", max_length=64) token = models.CharField(verbose_name="TOKEN", max_length=64, null=True, blank=True) roles = models.ManyToManyField(verbose_name="角色", to="Role")
# urls.pyfrom django.urls import path, re_path, includefrom app01 import viewsurlpatterns = [ path("api/auth/", views.AuthView.as_view()), path("api/order/", views.OrderView.as_view()),]
# views.pyimport uuidfrom rest_framework.views import APIViewfrom rest_framework.request import Requestfrom rest_framework.response import Responsefrom rest_framework.authentication import BaseAuthenticationfrom rest_framework.permissions import BasePermissionfrom rest_framework.exceptions import AuthenticationFailedfrom app01 import modelsclass AuthView(APIView): """ 用户登录认证 """ def post(self, request, *args, **kwargs): print(request.data) # {"username": "wupeiqi", "password": "123"} username = request.data.get("username") password = request.data.get("password") user_object = models.UserInfo.objects.filter(username=username, password=password).first() if not user_object: return Response({"code": 1000, "data": "用户名或密码错误"}) token = str(uuid.uuid4()) user_object.token = token user_object.save() return Response({"code": 0, "data": {"token": token, "name": username}})class TokenAuthentication(BaseAuthentication): def authenticate(self, request): token = request.query_params.get("token") if not token: raise AuthenticationFailed({"code": 1002, "data": "认证失败"}) user_object = models.UserInfo.objects.filter(token=token).first() if not user_object: raise AuthenticationFailed({"code": 1002, "data": "认证失败"}) return user_object, token def authenticate_header(self, request): return "Bearer realm="API""class PermissionA(BasePermission): message = {"code": 1003, "data": "无权访问"} def has_permission(self, request, view): exists = request.user.roles.filter(title="员工").exists() if exists: return True return False def has_object_permission(self, request, view, obj): return Trueclass PermissionB(BasePermission): message = {"code": 1003, "data": "无权访问"} def has_permission(self, request, view): exists = request.user.roles.filter(title="主管").exists() if exists: return True return False def has_object_permission(self, request, view, obj): return Trueclass OrderView(APIView): authentication_classes = [TokenAuthentication, ] permission_classes = [PermissionA, PermissionA] def get(self, request, *args, **kwargs): return Response({"code": 0, "data": {"user": None, "list": [1, 2, 3]}})class PayView(APIView): authentication_classes = [TokenAuthentication, ] permission_classes = [PermissionA, ] def get(self, request, *args, **kwargs): return Response({"code": 0, "data": "数据..."})
5. 关于has_object_permission
后期补充...
6. 源码分析
第三步前面的部分执行流程和前两篇文章是一样的. 这里就不过多赘述了
标签:
相关文章
DRF的权限组件(源码分析)
DRF的权限组件(源码分析)1 创建用户表fromdjango dbimportmodels Createyourmodelshere classUserInfo(model
全球快资讯:白脉软膏的功效_白脉软膏说明书
1、白脉软膏的话主要治疗瘫痪的,这个使用方法一般是,用一点白脉软膏涂抹于你的患处。2、一天大概两到三次就可以了,在进行治
每日观察!花鸭借钱不还会不会上征信
网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天后上报给征信机构,因为有些借贷机构可
天天快资讯丨他宣布参加2024年美国总统选举,竞选原因是……
据美媒报道,当地时间20日,美国保守派电台主持人拉里·埃尔德(LarryElder)宣布,他将参加2024年的美国总统竞选。图片来源:拉里·埃尔德社交
今日企业管理理念是如何更新的?
企业管理理念是如何更新的?很多人还不知道,现在让我们一起来看看吧!1、企业管理理念是如何更新的。2、首先,得看影响企业管理理念的因素有
注意!康欣新材将于5月17日召开股东大会
康欣新材(SH600076,收盘价:2 8元)4月21日发布公告称,2023年5月17日9点30分,公司将在公司会议室召开2022年年度股东大会。本次股东大会将
【天天新要闻】A股收评:沪指跌1.95%险守3300点,AI概念股集体大跌
军工股冲高回落,理工导航、华如科技涨超10%,中船科技涨停。 下跌方面,AI概念股集体大跌,易华录、云从科技等跌超10%,深桑达A、太极股份等
上海二手房核验价有所放松?银行信贷人士:购房者首付压力有所减轻|当前关注
上海二手房核验价有所放松?银行信贷人士:购房者首付压力有所减轻:据上证报,有市场消息传出,上海二手房核验价和“三价就低”疑似有所放...
每日观点:蓝色光标今日20%涨停 二机构净买入2.97亿元
证券时报e公司讯,蓝色光标(300058)今日20%涨停,成交额61 14亿元,换手率26 39%。盘后龙虎榜数据显示,深股通专用席位买入4 15亿元并卖出38
世界报道:鱼骨怎么弄酥 鱼骨怎样做酥
1、鱼骨酥的做法:把鱼骨给弄好。切掉多余的肉,清洗干净。把鱼骨切成小块。小块方便入味,当然如果喜欢大块的话也是可以的,只是炸的时候比较
智能楼宇自动化技术_对于智能楼宇自动化技术简单介绍|全球资讯
1、《智能楼宇自动化技术》是在2009年中国电力出版社出版的图书,作者是赵乃卓、张明健。2、本书可作为高等院校电气工程及
【天天热闻】亿联网络2022年年度董事会经营评述
亿联网络2022年年度董事会经营评述内容如下: 一、报告期内公司所处行业情况 (一)行业基本情况 随着计算机应用的不断发展和智能设
“调皮”小镯子的“旅途” 幸亏碰见了警察蜀黍
齐鲁网·闪电新闻4月21日讯4月20日上午11点多,滨州市公安局滨城分局北镇派出所接到了一个紧急的报警电话,称东西丢了!
室内运动项目图片大全_室内运动项目有哪些
1、项目有很多。2、之前我有耍过的。3、但是看你是自己家里耍还是在外面去看,我耍的都是外面店子的。4、比如有:兵兵球、羽
纯碱龙虎榜 | 多头减仓 纯碱盘中“狂泻”超6%
纯碱309合约今日增仓下行,多空持仓排名前20席中,多头第一名国泰君安占全市场6%,空头第一名中信期货占全市场8%。
每日视讯:推动特高压输电装备等新型基础设施共享共用!重庆市北碚区与四川省天府新区签订战略合作框架协议
推动特高压输电装备等新型基础设施共享共用!重庆市北碚区与四川省天府新区签订战略合作框架协议,4月13日,重庆市北碚区与四川省天府新区签订
热门:财政部决定于10月14日招标发行两只国债
财政部网站10月10日消息,财政部决定于10月14日招标发行两只国债。其中,计划发行2022年记账式附息(二十二期)国债
环球消息!光电股份:2022年度净利润约7108万元 同比增加13.75%
光电股份(SH600184,收盘价:12 54元)4月20日晚间发布年度业绩报告称,2022年营业收入约25 13亿元,同比减少24 12%;归属于上市公司股东的净
无法显示此网页怎么解决win10_无法显示此网页
1、右键单击开始按钮,如下图所示。2、右键菜单,点击运行,如下图所示。3、在操作中回车回车,如下图所示。4、输入网络连接
央行:M2增速与金融体系靠前发力等因素有关 快资讯
据央视新闻,中国人民银行表示,M2的增速比较高,主要是金融体系靠前发力,加强对实体经济的资金支持,派生的货币相应增加。资管资金回流表内
陈方:“人民警察的心里时刻要装着人民”
陈方:“人民警察的心里要时刻装着人民”多彩贵州网记者何川一位平实无华的民警,从警11年如一日,一直扎根乡村派出所,像一
异地医保报销比例及范围2023年具体如下! 独家焦点
2023年异地医保报销比例是多少?异地医保报销范围是怎样的?接下来跟社保网小编一起来看看吧!报销比例为门槛费以上至3000元报88%,3000-5000
甘肃省临泽县市场监督管理局多举措制止餐饮浪费-观热点
甘肃省临泽县市场监督管理局以创建国家食品安全示范城市为契机,压紧压实各方责任,深入开展制止餐饮浪费专项行动,积极营造节约社会氛围,全