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 相关文章推荐
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
Apr 18 Python
python sort、sort_index方法代码实例
Mar 28 Python
django中瀑布流写法实例代码
Oct 14 Python
浅析PEP572: 海象运算符
Oct 15 Python
python实现超市商品销售管理系统
Nov 22 Python
Django密码存储策略分析
Jan 09 Python
Django 实现对已存在的model进行更改
Mar 28 Python
基于PyTorch的permute和reshape/view的区别介绍
Jun 18 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
Jun 24 Python
python实现简单遗传算法
Sep 18 Python
python Tkinter模块使用方法详解
Apr 07 Python
Python如何用re模块实现简易tokenizer
May 02 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
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
Bootstrap CSS组件之按钮组(btn-group)
2016/12/17 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
seajs中最常用的7个功能、配置示例
2017/10/10 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
2020/06/19 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
Vue表单提交点击事件只允许点击一次的实例
2020/10/23 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
python多线程抓取天涯帖子内容示例
2014/04/03 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
python实现名片管理系统项目
2019/04/26 Python
keras 多任务多loss实例
2020/06/22 Python
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
美国在线乐器和设备商店:Musician’s Friend
2018/07/06 全球购物
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
什么是servlet
2012/05/08 面试题
最新大学职业规划书范文
2013/12/30 职场文书
季度思想汇报
2014/01/01 职场文书
水电工岗位职责
2014/02/12 职场文书
《愚公移山》教学反思
2014/02/20 职场文书
心理健康活动总结
2014/04/30 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
爱的承诺书
2015/01/20 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers