You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的权限。

二、视图层必须做双重校验

哪怕组权限配置正确,视图层也得做校验——这是安全的双重保障,防止权限配置意外出错或者有人通过直接构造请求绕过前端:

  1. 前端隐藏删除按钮:在渲染列表的模板里,只有当用户拥有删除权限时才显示删除按钮,避免用户看到不该有的操作入口:
    {% if perms.your_app.delete_x %}
      <button class="delete-btn" data-id="{{ x.id }}">删除</button>
    {% endif %}
    
  2. 后端强制校验权限:处理删除请求的视图里,一定要先检查用户权限,没有权限就直接返回禁止访问:
    • 函数视图的例子:
      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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:40:20