必须从路由控制、权限定义、菜单绑定和数据操作四层硬性约束高危菜单删除权限:1. 明确权限/角色/用户/菜单/配置为高危项;2. 禁用对应DELETE路由权限并仅授权super-admin;3. 菜单项绑定细粒度permission标识如menu.delete;4. 控制器中显式校验Permission::check('menu.delete')并加业务限制。

要限制高危菜单的删除权限,不能只靠隐藏按钮或前端拦截——必须从路由控制、权限定义、菜单绑定和数据操作四层做硬性约束。核心是让“删除菜单”这个动作本身不可达,而非仅不让用户看见。
1. 明确哪些属于高危菜单项
高危菜单通常指直接影响系统结构或安全边界的条目,例如:
- 权限管理(
/admin/auth/permissions) - 角色管理(
/admin/auth/roles) - 用户管理(
/admin/auth/users) - 菜单管理自身(
/admin/auth/menu) - 系统配置(
/admin/settings)
2. 禁用对应路由的删除权限
进入后台权限管理页面(/admin/auth/permissions),找到与这些菜单关联的 DELETE 权限项,逐个检查并确保:
- HTTP method 设为 DELETE
- HTTP path 填写精确路径,如
/admin/auth/permissions/{id}或前缀匹配/admin/auth/permissions* - 权限标识(slug)命名清晰,如
permission.delete、menu.delete - 不将该权限分配给普通管理员或编辑角色;仅保留给超级管理员(如
super-admin角色)
3. 菜单项绑定细粒度权限标识
在菜单配置中(app/Admin/bootstrap.php 或自定义 Menu 模型),为高危菜单项显式指定 permission 字段:
'Menu Management' => [
'icon' => 'fa-list',
'route' => 'admin.auth.menu',
'permission' => 'menu.view', // 只允许查看
],
'Delete Menu Item' => [
'icon' => 'fa-trash',
'route' => 'admin.auth.menu.destroy',
'permission' => 'menu.delete', // 单独拆出删除权限
],
这样即使用户能访问菜单列表页,也因缺少 menu.delete 权限而无法触发删除操作。
4. 在控制器中加固删除逻辑
对关键删除方法(如 MenuController@destroy)添加显式权限校验:
use Encore\Admin\Auth\Permission;
public function destroy($id)
{
Permission::check('menu.delete');
$menu = Menu::findOrFail($id);
// 可选:追加业务级限制,如禁止删除根节点或系统默认菜单
if ($menu->parent_id === 0 && in_array($menu->title, ['Dashboard', 'System'])) {
abort(403, '系统默认菜单不可删除');
}
$menu->delete();
return response()->json(['status' => 'deleted']);
}
注意:Laravel-admin 默认已对资源控制器的 destroy 方法启用权限中间件,但显式调用 Permission::check() 更可靠,且便于加额外判断。
不复杂但容易忽略——真正起作用的是权限标识与路由路径的严格对应,以及角色分配时的审慎原则。


















