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 refrom django.contrib.auth.models import AnonymousUser
from rest_framework.permissions import BasePermissionclass PermissionControl(BasePermission):"""自定义权限控制类"""def has_permission(self, request, view):# 0.若用户未登陆直接访问,返回未授权if isinstance(request.user, AnonymousUser):return Falsepermission_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 Trueelse:return Falseelif request.method == 'POST' and re.match(r'^/role_manage/roles/$', request.path):if 'add_role' in permission_list:return Trueelse:return Falseelif request.method == 'PUT' and re.match(r'^/role_manage/roles/\d+/$', request.path):if 'change_role' in permission_list:return Trueelse:return Falseelif request.method == 'PATCH' and re.match(r'^/role_manage/roles/\d+/$', request.path):if 'change_role' in permission_list:return Trueelse:return Falseelif request.method == 'DELETE' and re.match(r'^/role_manage/roles/\d+/$', request.path):if 'delete_role' in permission_list:return Trueelse:return False# 同理,判断所有路由及权限def has_object_permission(self, request, view, obj):"""GET请求单个对象时执行"""# 0.若用户未登陆直接访问,返回未授权if isinstance(request.user, AnonymousUser):return Falsepermission_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 Trueelse: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 = RoleSerializerpermission_classes = [PermissionControl]filterset_class = RoleFilterpagination_class = StandarPageNumberPagination
5.数据库中组(角色)权限表需添加角色权限,如:

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
