超级管理员需通过菜单配置、权限绑定和路由守卫协同实现专属菜单与显式权限控制:在菜单管理中注册带唯一permission字段的菜单项;在权限管理中创建对应权限并关联至administrator角色;控制器中二次校验权限;前端菜单通过isrole判断动态渲染。

超级管理员默认拥有全部权限,但若需为其单独设置专属菜单并附加显式权限控制(比如隐藏普通菜单、仅显示特定高危操作入口),不能只依赖“角色全权”,而要通过菜单配置 + 权限绑定 + 路由守卫三者协同实现。
专属菜单注册与权限标识绑定
在菜单管理页面(/admin/auth/menu)或通过代码方式添加菜单项时,必须为该菜单明确指定 permission 字段,且该标识不能与其他角色共用:
- 菜单名称:系统审计日志
- URL路径:
/admin/audit-logs -
权限标识(slug):
view-audit-log(建议带前缀避免冲突) - 图标:
fa-file-alt - 是否启用权限校验:开启(确保
'check_route_permission' => true在config/admin.php中已启用)
创建专属权限并关联到超级管理员角色
进入权限管理页面(/admin/auth/permissions),新增一条权限规则:
- 权限标识:
view-audit-log - 权限名称:查看系统审计日志
- HTTP 方法:
GET - HTTP 路径:
/admin/audit-logs*(支持通配符,覆盖列表页、详情页等)
然后进入角色管理(/admin/auth/roles),找到 administrator 角色(Laravel-admin 默认超级管理员角色),勾选刚创建的 view-audit-log 权限 —— 注意:不要直接给用户分配权限,始终走「角色→权限」链路,便于后续统一调整。
控制器中强化权限校验(可选但推荐)
即使路由层已受控,关键操作仍建议在控制器中二次校验,防止绕过:
use Encore\Admin\Auth\Permission;
class AuditLogController extends Controller
{
public function index()
{
Permission::check('view-audit-log');
// 加载审计日志数据(可叠加行级过滤,如仅显示最近7天)
$logs = AuditLog::where('created_at', '>=', now()->subDays(7))->get();
return Admin::content(function (Content $content) use ($logs) {
$content->header('审计日志');
$content->body(view('admin.audit.index', compact('logs')));
});
}
}
前端菜单动态渲染控制
若希望该菜单**仅对超级管理员可见**(连菜单栏都不出现),需在菜单定义中加入权限判断逻辑。例如,在自定义菜单模型的 menu() 方法中:
public function menu()
{
$menu = [
'Dashboard' => [
'icon' => 'fa-tachometer-alt',
'route' => 'admin.home',
],
];
// 仅当当前用户是超级管理员时才显示专属菜单
if (Admin::user()->isRole('administrator')) {
$menu['系统审计'] = [
'icon' => 'fa-file-alt',
'route' => 'admin.audit-logs.index',
'permission' => 'view-audit-log',
];
}
return $menu;
}
再将该菜单模型注册进系统(参考 config/admin.php 的 menu_model 配置),即可实现菜单级可见性隔离。











