网络编程
位置:首页>> 网络编程>> Python编程>> Django权限控制的使用

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.数据库中组(角色)权限表需添加角色权限,如:

Django权限控制的使用

来源:https://blog.csdn.net/zhu6201976/article/details/85261410

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com