You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Django函数视图中@permission_required装饰器失效问题排查

排查Django权限配置导致的403 Forbidden问题

咱们一步步来拆解你遇到的这个权限问题,从最常见的几个关键点入手:

1. 确认permission_required装饰器用对了权限标识

你在添加权限时用的是Permission.objects.get(name='Can view excel data'),但@permission_required装饰器里写的是'excel_data.view_exceldata'——这里要注意,Django的permission_required默认依赖的是权限的codename(而非name字段)。

你可以先在Django Shell里验证这个权限的codename和所属app是否匹配:

# 进入Django shell后执行
from django.contrib.auth.models import Permission
perm = Permission.objects.get(name='Can view excel data')
print(perm.codename)       # 确认输出是否为view_exceldata
print(perm.content_type.app_label)  # 确认是否为excel_data

如果这两个值和装饰器里的字符串不匹配,权限检查自然会失败。

2. 刷新用户权限缓存

Django会缓存用户的权限信息,哪怕数据库里已经添加了权限,当前登录的用户会话可能还没同步更新。试试这两个办法:

  • 让用户完全退出登录再重新登录,触发会话重新加载权限
  • 在添加权限的函数里,强制刷新用户对象:
    def add_permission(request):
        user = User.objects.create_user(
            username=request.POST.get('username'),
            email=request.POST.get('email'),
            password=request.POST.get('password'),
            is_staff=1,
            is_superuser=0,
        )
        permission = Permission.objects.get(name='Can view excel data')
        user.user_permissions.add(permission)
        user.save()
        user.refresh_from_db()  # 添加这一行,强制从数据库刷新权限
    

3. 验证当前登录用户的权限状态

有时候我们会误以为权限配置给了目标用户,但实际可能登错了账号,或者配置过程有疏漏。你可以在视图里加几行调试代码:

@login_required(login_url='loginPage')
@permission_required('excel_data.view_exceldata', raise_exception=True)
def viewExcel(request):
    # 打印当前登录用户和权限状态
    print(f"当前登录用户:{request.user.username}")
    print(f"是否拥有目标权限:{request.user.has_perm('excel_data.view_exceldata')}")
    
    excelInfo = ExcelData.objects.filter(deleted=0).order_by('-pk')
    return render(request, 'excelData.html', {'excelInfo': excelInfo})

如果has_perm返回False,说明权限确实没生效,回到前面的步骤排查;如果返回True但还是403,那可能是项目里有自定义中间件或其他权限逻辑在干扰。

4. 检查模型权限是否正确生成

确保你的ExcelData模型已经在Django Admin中注册,Django会自动为注册的模型生成view/add/change/delete四类权限。你可以在Admin后台的「权限」列表里搜索excel_data相关项,确认Can view excel data权限存在且对应正确的模型。

5. 排查自定义权限逻辑

如果项目里有自定义的权限中间件、全局权限装饰器,或者视图里还有其他权限校验代码,可能会覆盖permission_required的检查结果。你可以暂时注释掉这些自定义逻辑,测试是否还会出现403。


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

火山引擎 最新活动