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编程开发之textwrap文本样式处理技巧
Nov 13 Python
python 接口_从协议到抽象基类详解
Aug 24 Python
详解python函数传参是传值还是传引用
Jan 16 Python
全面分析Python的优点和缺点
Feb 07 Python
PyCharm代码格式调整方法
May 23 Python
Django如何自定义分页
Sep 25 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
python进程和线程用法知识点总结
May 28 Python
基于python 微信小程序之获取已存在模板消息列表
Aug 05 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
Feb 20 Python
用Python在Excel里画出蒙娜丽莎的方法示例
Apr 28 Python
解决Pyinstaller打包软件失败的一个坑
Mar 04 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
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
使用php重新实现PHP脚本引擎内置函数
2007/03/06 PHP
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
2012/07/16 PHP
php设计模式小结
2013/02/15 PHP
PHP下载远程文件到本地存储的方法
2015/03/24 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
2014/05/04 Javascript
JavaScript 学习笔记之操作符(续)
2015/01/14 Javascript
微信小程序之批量上传并压缩图片的实例代码
2018/07/05 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
[42:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS OpTic
2018/03/31 DOTA
对numpy中轴与维度的理解
2018/04/18 Python
Python实现的简单计算器功能详解
2018/08/25 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
对python读写文件去重、RE、set的使用详解
2018/12/11 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
python实现大量图片重命名
2020/03/23 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
模具专业毕业生自荐书范文
2014/02/19 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
2015年党员承诺书
2015/01/21 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js