Django权限疑问:无删除权限用户能否从视图删除模型对象?
这肯定不是正常的权限控制结果啊——你明确给组G只开了模型X的创建和修改权限,删除权限完全没授权,但用户U却能执行删除操作,说明你的权限管控链有漏洞,得从两个层面补全控制。
问题根源
这种情况一般是两个原因之一:要么你给组G配置权限时不小心带上了删除权限,要么视图层完全没做权限校验,导致哪怕用户没有权限,只要能访问页面就能触发删除操作。
解决步骤
一、先把组权限的配置搞准
首先得确保组G的权限列表里真的没有删除模型X的权限:
- 如果是用后台管理界面配置的,直接打开组G的编辑页,找到模型X对应的权限,只勾选创建和修改,把删除权限的勾选去掉。
- 如果是用代码分配权限,要确保只添加需要的权限,别把删除权限加进去。举个Django里的例子:
from django.contrib.auth.models import Group, Permission from your_app.models import X # 获取模型X的创建、修改权限 add_perm = Permission.objects.get(codename='add_x', content_type__app_label='your_app') change_perm = Permission.objects.get(codename='change_x', content_type__app_label='your_app') # 给组G添加权限,注意绝对不要加delete_x这个权限 group_g = Group.objects.get(name='G') group_g.permissions.add(add_perm, change_perm) group_g.save()
配置完后,记得用用户U登录,在后台的用户权限页确认一下,用户U的有效权限里确实没有删除模型X的权限。
二、视图层必须做双重校验
哪怕组权限配置正确,视图层也得做校验——这是安全的双重保障,防止权限配置意外出错或者有人通过直接构造请求绕过前端:
- 前端隐藏删除按钮:在渲染列表的模板里,只有当用户拥有删除权限时才显示删除按钮,避免用户看到不该有的操作入口:
{% if perms.your_app.delete_x %} <button class="delete-btn" data-id="{{ x.id }}">删除</button> {% endif %} - 后端强制校验权限:处理删除请求的视图里,一定要先检查用户权限,没有权限就直接返回禁止访问:
- 函数视图的例子:
from django.http import HttpResponseForbidden, redirect from your_app.models import X def delete_x(request, x_id): # 先校验权限,没权限直接返回403 if not request.user.has_perm('your_app.delete_x'): return HttpResponseForbidden("抱歉,你没有删除该对象的权限") # 权限通过再执行删除逻辑 try: x_obj = X.objects.get(id=x_id) x_obj.delete() # 重定向到列表页 return redirect('x_list') except X.DoesNotExist: return HttpResponseNotFound("对象不存在") - 类视图的例子(比如用Django的DeleteView):
from django.views.generic.edit import DeleteView from django.core.exceptions import PermissionDenied from your_app.models import X class XDeleteView(DeleteView): model = X success_url = '/x/list/' def has_permission(self): # 校验当前用户是否有删除权限 return self.request.user.has_perm('your_app.delete_x') def dispatch(self, request, *args, **kwargs): if not self.has_permission(): raise PermissionDenied("你没有删除权限") return super().dispatch(request, *args, **kwargs)
- 函数视图的例子:
最后总结
只要把组权限的配置精准化,再加上视图层的前端隐藏+后端校验,就能彻底阻止用户U执行删除操作。权限管控一定要做“双重保险”,不能只依赖某一层,不然很容易出现这种越权的情况。
内容的提问来源于stack exchange,提问作者Timer
相关产品推荐
相关产品推荐

