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开发之str.format()用法实例分析
Feb 22 Python
关于Python中浮点数精度处理的技巧总结
Aug 10 Python
python中实现延时回调普通函数示例代码
Sep 08 Python
Python获取指定文件夹下的文件名的方法
Feb 06 Python
对python3标准库httpclient的使用详解
Dec 18 Python
在python中利用numpy求解多项式以及多项式拟合的方法
Jul 03 Python
Python寻找路径和查找文件路径的示例
Jul 10 Python
使用Python获取当前工作目录和执行命令的位置
Mar 09 Python
python通过函数名调用函数的几种场景
Sep 23 Python
如何用tempfile库创建python进程中的临时文件
Jan 28 Python
详解运行Python的神器Jupyter Notebook
Jun 03 Python
Python实现抖音热搜定时爬取功能
Mar 16 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
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
js实现网页自动刷新可制作节日倒计时效果
2014/05/27 Javascript
JavaScript实现找出字符串中第一个不重复的字符
2014/09/03 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
详解JavaScript时间格式化
2015/12/23 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
对tf.reduce_sum tensorflow维度上的操作详解
2018/07/26 Python
python 格式化输出百分号的方法
2019/01/20 Python
Marriott国际:万豪国际酒店查询预订
2017/09/25 全球购物
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
AssertionError 跟一下那个类是 “is – a”的关系
2012/02/21 面试题
本科应届生求职信
2014/08/05 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
写给同事的离职感言
2015/08/04 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js
MySQL解决Navicat设置默认字符串时的报错问题
2022/06/16 MySQL
利用Apache Common将java对象池化的问题
2022/06/16 Servers
Vue Element plus使用方法梳理
2022/12/24 Vue.js