Django权限控制的使用


Posted in Python onJanuary 07, 2021

自己搭建后台网站,需求:实现类似django Admin站点对每一张表的增删改查权限控制。

实现步骤:

1.权限控制Django框架已自带,共6张表,User表,Group表,UserGroup表,Permission表,GroupPermission表,UserPermission表,一般情况下,使用默认即可。

2.若User表自定义,需继承Django自带AbstractUser类,Group表同理。

3.创建类PermissionControl继承BasePermission,重写has_permission和has_object_permission方法。

import re
 
from django.contrib.auth.models import AnonymousUser
from rest_framework.permissions import BasePermission
 
 
class PermissionControl(BasePermission):
  """自定义权限控制类"""
 
  def has_permission(self, request, view):
    # 0.若用户未登陆直接访问,返回未授权
    if isinstance(request.user, AnonymousUser):
      return False
    permission_list = request.user.role.get_all_permissions()
    # 1.角色管理-角色
    if request.method == 'GET' and re.match(r'^/role_manage/roles/$', request.path):
      if 'view_role' in permission_list:
        return True
      else:
        return False
    elif request.method == 'POST' and re.match(r'^/role_manage/roles/$', request.path):
      if 'add_role' in permission_list:
        return True
      else:
        return False
    elif request.method == 'PUT' and re.match(r'^/role_manage/roles/\d+/$', request.path):
      if 'change_role' in permission_list:
        return True
      else:
        return False
    elif request.method == 'PATCH' and re.match(r'^/role_manage/roles/\d+/$', request.path):
      if 'change_role' in permission_list:
        return True
      else:
        return False
    elif request.method == 'DELETE' and re.match(r'^/role_manage/roles/\d+/$', request.path):
      if 'delete_role' in permission_list:
        return True
      else:
        return False
 
    # 同理,判断所有路由及权限
 
  def has_object_permission(self, request, view, obj):
    """GET请求单个对象时执行"""
    # 0.若用户未登陆直接访问,返回未授权
    if isinstance(request.user, AnonymousUser):
      return False
    permission_list = request.user.get_all_permissions()
    # 1.角色管理-角色
    if request.method == 'GET' and re.match(r'^/role_manage/roles/\d+/$', request.path):
      if 'view_role' in permission_list:
        return True
      else:
        return False
    # 同理,判断所有路由及权限

4.视图中使用,本网站使用drf框架,仅需在要控制权限的类视图中加上permission_classes权限控制即可。

class RoleViewSet(ModelViewSet):
  """
  list:
  查询所有角色
  read:
  根据角色id,查询角色
  create:
  创建角色
  delete:
  根据角色id,删除角色
  update:
  根据角色id,更新角色信息
  partial_update:
  根据角色id,部分更新角色信息
  """
  queryset = Role.objects.filter(is_delete=0).all()
  serializer_class = RoleSerializer
  permission_classes = [PermissionControl]
  filterset_class = RoleFilter
  pagination_class = StandarPageNumberPagination

5.数据库中组(角色)权限表需添加角色权限,如:

Django权限控制的使用

到此这篇关于Django权限控制的使用的文章就介绍到这了,更多相关Django权限控制内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python不带重复的全排列代码
Aug 13 Python
python写的ARP攻击代码实例
Jun 04 Python
使用Python导出Excel图表以及导出为图片的方法
Nov 07 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 Python
ubuntu环境下python虚拟环境的安装过程
Jan 07 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
May 21 Python
详解多线程Django程序耗尽数据库连接的问题
Oct 08 Python
python实现微信定时每天和女友发送消息
Apr 29 Python
Python代码实现http/https代理服务器的脚本
Aug 12 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
浅谈django 重载str 方法
May 19 Python
浅谈pymysql查询语句中带有in时传递参数的问题
Jun 05 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
Jan 07 #Python
Jupyter Notebook添加代码自动补全功能的实现
Jan 07 #Python
jupyter notebook更换皮肤主题的实现
Jan 07 #Python
基于 Python 实践感知器分类算法
Jan 07 #Python
如何编写python的daemon程序
Jan 07 #Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
Jan 07 #Python
详解Python遍历列表时删除元素的正确做法
Jan 07 #Python
You might like
使用字符串函数输出整数化的PHP版本号
2006/10/09 PHP
从php核心代码分析require和include的区别
2011/01/02 PHP
PHP静态文件生成类实例
2014/11/29 PHP
php生成图片验证码
2015/06/09 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
2016/01/19 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
vant中的toast层级改变操作
2020/11/04 Javascript
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
Python中让MySQL查询结果返回字典类型的方法
2014/08/22 Python
python中反射用法实例
2015/03/27 Python
解析Python中的异常处理
2015/04/28 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
2020/02/29 Python
英格兰足协官方商店:England Store
2019/07/12 全球购物
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
类如何去实现接口
2013/12/19 面试题
什么是Remote Module
2016/06/10 面试题
投资合作协议书范本
2014/04/17 职场文书
银行优秀员工事迹材料
2014/05/29 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers