如何在Django中限制管理员访问用户私人日记条目?
Django日记应用:限制普通管理员仅访问自己的日记条目
你的两段代码都存在权限覆盖不完整的问题,导致无法彻底限制普通管理员的访问权限,以下是问题分析和修复方案:
问题分析
第一段代码(仅重写get_queryset):
只限制了列表页的查询结果,但普通管理员如果知道其他用户日记的ID,直接通过URL访问编辑/详情页时,依然能查看或修改不属于自己的日记,因为没有限制单对象的操作权限。第二段代码(仅重写has_view_permission):
当obj=None(也就是列表页场景)时直接返回True,这会让普通管理员看到所有日记的列表,只有点击单条日记时才会被拦截,不符合“完全限制访问”的需求。
完整解决方案
需要同时重写查询集限制和所有核心权限方法,确保普通管理员从列表到单对象操作都只能接触自己的日记,超级管理员不受限制:
from django.contrib import admin from .models import Journal class JournalAdmin(admin.ModelAdmin): def get_queryset(self, request): # 列表页只显示当前用户(非超级管理员)的日记 qs = super().get_queryset(request) if request.user.is_superuser: return qs return qs.filter(user=request.user) def has_view_permission(self, request, obj=None): # 超级管理员可查看所有,普通管理员只能查看自己的日记 if request.user.is_superuser: return True if obj: return obj.user == request.user # 非超级用户在列表页的权限,这里返回True是因为get_queryset已经做了过滤 return True def has_change_permission(self, request, obj=None): # 限制修改权限:仅超级管理员或日记所属用户可修改 if request.user.is_superuser: return True if obj: return obj.user == request.user return False def has_delete_permission(self, request, obj=None): # 限制删除权限:仅超级管理员或日记所属用户可删除 if request.user.is_superuser: return True if obj: return obj.user == request.user return False admin.site.register(Journal, JournalAdmin)
额外注意事项
- 确保你的
Journal模型中存在user外键字段,关联到Django的User模型,且每个日记条目都正确关联了创建它的用户。 - 测试时请使用普通管理员账号(非superuser)验证,避免用超级管理员测试导致误判。
内容的提问来源于stack exchange,提问作者lilsnow02
相关产品推荐
相关产品推荐

