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

为何user.has_perm始终返回True?Django组权限移除异常排查

问题排查原因及解决办法
  • 用户自身直接持有delete_department权限
    Django的has_perm()会同时检查用户个人权限和所属组权限,只要任一来源有权限就返回True。如果用户自己被直接分配了该权限,哪怕组权限移除,结果依然为True。可以执行以下代码验证并处理:

    # 检查用户是否直接拥有该权限
    if user.user_permissions.filter(codename='delete_department').exists():
        perm = Permission.objects.get(codename='delete_department')
        user.user_permissions.remove(perm)
    
  • 权限缓存未更新
    Django默认会缓存用户的权限集合,修改组权限后缓存不会自动失效,导致has_perm()读取旧数据。解决方式有两种:

    1. 重新从数据库获取用户对象:
      user = User.objects.get(pk=user.pk)
      
    2. 手动清除权限缓存:
      user.get_user_permissions.cache_clear()
      user.get_group_permissions.cache_clear()
      user.get_all_permissions.cache_clear()
      
  • 组权限移除操作未生效
    代码中通过循环筛选权限可能出现遗漏(比如department_permission未包含目标权限),建议直接精准获取权限再移除,避免循环出错:

    content_type = ContentType.objects.get_for_model(Department)
    delete_perm = Permission.objects.get(content_type=content_type, codename="delete_department")
    student_group.permissions.remove(delete_perm)
    
  • 用户属于多个权限组
    如果用户除了student组,还加入了其他拥有delete_department权限的组,那么has_perm()仍会返回True。可以通过user.groups.all()查看所有所属组,逐一排查这些组的权限配置。

内容的提问来源于stack exchange,提问作者Zahidul Islam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:15:46