Django权限控制的使用
作者:zhu6201976-朱华龙 发布时间:2023-12-27 01:50:57
标签:Django,权限控制
自己搭建后台网站,需求:实现类似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.数据库中组(角色)权限表需添加角色权限,如:
来源:https://blog.csdn.net/zhu6201976/article/details/85261410


猜你喜欢
- 数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第三部分 概述:程序访问优化也可以认为是访问SQL语
- 由以下函数代替该功能:def cv_imread(file_path): cv_img=cv2.imdecode(np.fromfile(f
- 前言:c3p0 是一个开源的数据库连接池,实现了 JDBC 3 规范;本文主要介绍 c3p0 的基本使用,文中使用到的软件版本:Java 1
- 先直接上代码r := gin.Default()// 注册中间件,使body可以重复读取r.Use(func(context *gin.Co
- 本文所依赖的环境为:进程和线程的概念进程概念我们想运行一个程序,首先会将该程序从存储介质上通过IO总线加载进内存中,而后再通过cpu进行调度
- 一、场景浏览器访问淘宝,再访问天猫,继续访问1688......此时,浏览器中的cookie是什么状态?显然,包含上述3个网站的所有cook
- 我们将要来学习python的重要概念迭代和迭代器,通过简单实用的例子如列表迭代器和xrange。可迭代一个对象,物理或者虚拟存储的序列。li
- 1。帐号和口令设置 要选择用户SYS、SYSTEM、DBSNMP、SYSMAN使用相同的口令,那就选择“所有账户使用同一口令”。 BI用户,
- 本文实例讲述了原生JS实现的简单轮播图功能。分享给大家供大家参考,具体如下:经过几天的努力,终于攻克了这一难题,于是迫不及待的想要分享给大家
- 模块的作用是:允许从任何文件里得到任何一行或几行,并且使用缓存进行优化。有几个API接口linecache.getlines(filenam
- 1.前言有时候,我们需要把A库A1表某一部分或全部数据导出到B库B1表中,如果系统运维工程师没打通两个库链接,我们执行T-SQL是处理数据导
- 今天我们学习如何配置url、如何传参、如何命名、以及渲染的方式,内容大致有以下几个方面。创建视图函数并访问创建appdjango中url规则
- 子线程里是不能更新UI界面的,在移动端方面。Android的UI访问是没有加锁的,多个线程可以同时访问更新操作同一个UI控件。也就是说访问U
- MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的。点击进入:下载地址1.下面是msi的下载和安装的步骤点击进去之后根据自己
- Django配合python进行requests请求前言在我们写代码的时候,经常会用到前后端分离开发的方法,例如微信小程序,安卓,网站等等&
- 敲了一个错误的mysql命令, 想取消怎么办? 如果用ctrl + c, 就直接退出了。怎么办呢?来看看:mysql> show ta
- 五种Python下划线模式速查表:单前导下划线:_var当涉及到变量和方法名称时,单个下划线前缀有一个约定俗成的含义。 它是对程序员的一个提
- 开源方:微软安装:pip install playwright;python -m playwright install特点:自动化脚本录制
- function rss_locale_date ($fmt, $ts, $addTZOffset&
- 前言之前学习过node.js接触过express框架,最近为了编写一个mock server正好用到了express。下面正好就跟大家介绍一