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
相关产品推荐
相关产品推荐

