Wagtail如何设置指定页面仅允许对应所有者编辑且无法被绕过?
Wagtail非页面所有者编辑权限禁用方案
问题原因说明
你当前使用的PagePermissionHelper仅作用于ModelAdmin的UI渲染逻辑,只会控制编辑按钮是否显示,不会覆盖Wagtail核心页面编辑路由的权限校验规则,所以用户直接输入编辑URL就可以绕过限制。同理construct_main_menu钩子仅控制菜单显隐,本身不具备路由访问拦截能力。
PagePermissionHelper不是实现该需求的唯一选择,有两种更底层的方案可以实现真正的权限拦截:
方案1:使用before_edit_page钩子做路由层拦截
该钩子会在所有页面编辑视图加载前触发,直接对请求做校验,不满足条件直接返回403,适合不想修改页面模型的场景。
在你的应用下新建/修改wagtail_hooks.py,添加如下代码:
from wagtail import hooks from django.core.exceptions import PermissionDenied from .models import Store @hooks.register('before_edit_page') def check_store_page_edit_permission(request, page): # 仅对Store类型页面做权限校验 if isinstance(page, Store): if request.user != page.owner: raise PermissionDenied
方案2:重写页面模型的permissions_for_user方法
该方法是Wagtail页面权限校验的核心底层方法,所有涉及该页面的权限判断(包括ModelAdmin、页面编辑视图、API等)都会调用该方法的返回结果,适合作为模型级通用规则。
修改你的Store页面模型代码:
from wagtail.models import Page class Store(Page): # 原有字段定义保持不变 # ... def permissions_for_user(self, user): # 继承原有权限逻辑 perms = super().permissions_for_user(user) # 非所有者直接移除编辑权限 if user != self.owner: perms.can_edit = False return perms
使用该方案后,你之前自定义的ValidationPermissionHelper可以直接删除,ModelAdmin会自动继承模型的权限规则。
内容的提问来源于stack exchange,提问作者Karl Jhan
相关产品推荐
相关产品推荐

