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

Django中如何限制用户编辑不属于自身的Faculty关联数据

问题解答

权限校验基础结论

Django本身不会自动实现数据级的归属权限校验,框架默认仅提供登录态校验、管理员权限这类粗粒度的访问控制,涉及业务数据归属的细粒度校验必须由开发者手动实现。

具体修复方案

针对你当前的业务模型,最简单的修复方式是修改数据查询逻辑,在查询Faculty对象时直接加入当前登录用户的归属过滤,非本人归属的数据直接返回404即可,无需修改存量数据。

步骤1:补充基础校验依赖

首先给视图加@login_required装饰器,确保只有登录用户可以访问编辑/删除接口,同时导入Django内置的get_object_or_404工具简化异常处理。

步骤2:修改编辑视图的查询逻辑

修改后的edit_form代码如下:

from django.shortcuts import get_object_or_404, redirect, render
from django.contrib.auth.decorators import login_required

@login_required
def edit_form(request, pk):
    # 新增归属过滤:仅查询当前登录用户关联的University下的Faculty数据
    faculty = get_object_or_404(Faculty, id=pk, owner__user=request.user)
    
    form = AddFacultyForm(instance=faculty)
    if request.method == 'POST':
        form = AddFacultyForm(request.POST, instance=faculty)
        if form.is_valid():
            form.save()
            return redirect('faculty')

    context = {'form':form}
    return render(request, 'faculty/edit_form.html', context)

步骤3:同步修复删除视图的越权问题

删除接口也要加入完全相同的归属过滤逻辑,避免删除接口出现同样的越权漏洞:

@login_required
def delete(request, pk):
    faculty = get_object_or_404(Faculty, id=pk, owner__user=request.user)
    faculty.delete()
    return redirect('faculty')

扩展可选方案

如果后续业务复杂度提升,需要大量的对象级权限控制,可以引入第三方库django-guardian实现更灵活的权限配置,当前你的场景用上述手动过滤的方案完全可以覆盖需求,无需额外引入依赖。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:03:01