
本文介绍如何在 laravel-admin 管理后台中,基于当前登录用户的权限或角色,动态过滤并渲染顶部导航栏中的菜单链接,避免越权访问,提升系统安全性与用户体验。
本文介绍如何在 laravel-admin 管理后台中,基于当前登录用户的权限或角色,动态过滤并渲染顶部导航栏中的菜单链接,避免越权访问,提升系统安全性与用户体验。
Laravel-Admin 默认会通过 Admin::menuLinks() 返回全部注册的菜单项,但实际生产环境中,不同角色(如「内容编辑」、「用户管理员」、「技术运维」)应仅看到其有权限访问的模块入口。要实现按角色或权限精准控制顶部导航链接的显示逻辑,核心在于结合 Admin::user() 获取当前登录用户,并调用其内置的权限判断方法。
✅ 推荐方案:使用 can() 方法(基于权限粒度控制)
相比直接校验角色名,基于权限(Permission)的判断更灵活、更符合 RBAC 最佳实践。你可在路由或菜单定义时为每个模块绑定对应权限(如 'view-users', 'manage-posts'),再在模板中统一校验:
@foreach(Admin::menuLinks() as $link)
@if (Admin::user()->can($link['permission'] ?? 'access-' . $link['uri']))
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="%7B%7B%20admin_url(%24link['uri'])%20%7D%7D">
<i class="fa {{ $link['icon'] }}"></i>
{{ admin_trans($link['title']) }}
</a>
@endif
@endforeach
? 注意:需确保菜单项在 app/Admin/Menu.php 或路由定义中已显式设置 'permission' => 'view-posts' 等键值;若未设置,可约定默认权限命名规则(如 access-{uri}),或在 menuLinks() 前预处理数据注入权限字段。
✅ 备选方案:按角色名称精确匹配
若业务场景简单且角色划分明确(如仅 developer、editor、admin 三类),也可直接使用 isRole() 方法:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
@foreach(Admin::menuLinks() as $link)
@if (
($link['uri'] === 'users' && Admin::user()->isRole('admin')) ||
($link['uri'] === 'posts' && Admin::user()->isRole('editor', 'developer')) ||
($link['uri'] === 'comments' && Admin::user()->isRole('editor'))
)
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="%7B%7B%20admin_url(%24link['uri'])%20%7D%7D">
<i class="fa {{ $link['icon'] }}"></i>
{{ admin_trans($link['title']) }}
</a>
@endif
@endforeach
⚠️ 重要提醒:
- Admin::user() 在未登录时会返回 null,务必在布局模板开头添加空值防护(如 @auth 或 @if(Admin::user()) 包裹整个导航逻辑);
- 角色与权限需提前在数据库中配置,并通过 php artisan admin:publish --force 同步至管理界面;
- 所有后端路由仍需配合 can 中间件进行二次鉴权,前端隐藏 ≠ 权限豁免。
综上,推荐优先采用权限驱动(can())方式,兼顾扩展性与维护性;若短期快速上线,角色判断亦可作为有效补充。最终目标是:让每个管理员只看见“属于他”的那一部分系统入口,既简洁,又安全。










