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

Django中has_perm返回False但get_all_permissions显示有权限的问题

Django权限验证异常排查方案

可能的问题及解决步骤

1. 确认模型的app_label匹配

Django权限格式为app_label.action_modelname,需确保cust模型所属app的label确实是aaa:

  • 检查settings.py的INSTALLED_APPS中,该app的注册名称是否为aaa
  • 若模型不在默认app下,需在模型类的Meta中显式指定app_label:
    class cust(models.Model):
        cust = models.CharField(max_length=10)
        class Meta:
            app_label = 'aaa'
    

2. 刷新用户权限缓存

Django会缓存用户权限数据,若近期刚给用户添加权限,可能存在缓存不一致:

  • 强制从数据库重新加载用户对象:
    def permtest_view(request):
        user = request.user
        user.refresh_from_db()  # 刷新用户权限数据
        user_perm = user.get_all_permissions()
        user_test = user.has_perm('aaa.add_cust')
        print(user, user_perm, user_test)
    
  • 让用户重新登录,更新session中的权限缓存

3. 检查自定义用户模型的权限继承

如果使用了自定义用户模型,必须确保模型类继承PermissionsMixin:

from django.contrib.auth.models import AbstractUser, PermissionsMixin

class CustomUser(AbstractUser, PermissionsMixin):
    # 自定义字段
    pass

4. 验证权限字符串的一致性

直接对比权限字符串,确认无拼写或格式差异:

def permtest_view(request):
    user = request.user
    target_perm = 'aaa.add_cust'
    direct_check = target_perm in user.get_all_permissions()
    method_check = user.has_perm(target_perm)
    print(f"直接比对结果: {direct_check}, has_perm方法结果: {method_check}")

如果直接比对为True但has_perm返回False,需检查是否配置了自定义权限后端。

5. 排查自定义权限后端

若项目配置了自定义权限后端,需确认其has_perm方法逻辑正确:

  • 查看settings.py中的AUTHENTICATION_BACKENDS配置
  • 确保自定义后端的has_perm方法正确处理了权限判断逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:01:16