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使用PyGame绘制图像并保存为图片文件的方法
Apr 24 Python
通过数据库向Django模型添加字段的示例
Jul 21 Python
Python Unittest自动化单元测试框架详解
Apr 04 Python
python读取目录下最新的文件夹方法
Dec 24 Python
对python实现模板生成脚本的方法详解
Jan 30 Python
Python 中的pygame安装与配置教程详解
Feb 10 Python
python实现人机五子棋
Mar 25 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
给ubuntu18安装python3.7的详细教程
Jun 08 Python
Keras之fit_generator与train_on_batch用法
Jun 17 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
Jan 29 Python
Python图片处理之图片裁剪教程
May 27 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压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
php实现中文转数字
2016/02/18 PHP
php将html转为图片的实现方法
2017/05/19 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
JavaScript使用prototype定义对象类型(转)[
2006/12/22 Javascript
短信提示使用 特效
2007/01/19 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
vue中组件通信的八种方式(值得收藏!)
2019/08/09 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
python 生成不重复的随机数的代码
2011/05/15 Python
python爬取网站数据保存使用的方法
2013/11/20 Python
Python常用列表数据结构小结
2014/08/06 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
python实现QQ批量登录功能
2019/06/19 Python
python实现数据分析与建模
2019/07/11 Python
python3 字符串知识点学习笔记
2020/02/08 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
css3 border-radius属性详解
2017/07/05 HTML / CSS
CSS3中Animation属性的使用详解
2015/08/06 HTML / CSS
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
廉政承诺书
2015/01/19 职场文书
八一建军节主持词
2015/07/01 职场文书
财务管理制度范本
2015/08/04 职场文书
高一语文教学反思
2016/02/16 职场文书
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang