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

