游客访问后台时默认禁止访问所有菜单和路由,需通过auth::check()动态过滤菜单注册、admin::extend扩展菜单构建逻辑清空游客菜单、添加requireadminlogin中间件拦截未登录请求,并确保登录页路由放行。

游客(未登录用户)访问后台时,默认应禁止访问所有菜单和路由。Laravel-admin 本身不内置“游客角色”,需通过中间件 + 菜单注册逻辑配合实现隐藏菜单 + 拦截请求。
1. 在菜单注册时动态过滤游客可见项
在 app/Admin/routes.php 或菜单定义处(如 app/Admin/bootstrap.php),用 Auth::check() 控制是否注册某菜单:
use Illuminate\Support\Facades\Auth;
Admin::menu('系统设置', function ($menu) {
if (Auth::check()) {
$menu->add('参数管理', '/admin/params');
$menu->add('日志查看', '/admin/logs');
}
});
// 或更推荐:统一注册后按权限过滤显示(见下一条)
2. 使用 Admin::extend 扩展菜单构建逻辑(推荐)
在 app/Admin/bootstrap.php 中,重写菜单渲染前的过滤逻辑,让游客看不到敏感菜单:
use Encore\Admin\Layout\Menu;
use Illuminate\Support\Facades\Auth;
Admin::extend('menu', function ($menu) {
if (!Auth::check()) {
// 清空全部菜单(只留首页或登录页相关入口)
$menu->clear();
// 可选:添加游客能访问的链接(如“登录”)
$menu->add('登录', '/admin/login');
return;
}
// 已登录用户,保持默认菜单逻辑
});
3. 添加全局中间件拦截未登录访问
创建中间件 app/Http/Middleware/RequireAdminLogin.php:
php artisan make:middleware RequireAdminLogin
编辑内容:
public function handle($request, Closure $next)
{
if (!Auth::guard('admin')->check()) {
if ($request->expectsJson()) {
return response()->json(['message' => 'Unauthorized'], 401);
}
return redirect()->guest(admin_url('login'));
}
return $next($request);
}
然后在 app/Admin/routes.php 中为后台路由组应用该中间件:
Route::group([
'prefix' => config('admin.route.prefix'),
'namespace' => config('admin.route.namespace'),
'middleware' => ['web', 'admin', 'require.admin.login'], // 加上自定义中间件
], function ($router) {
$router->get('/', 'HomeController@index');
$router->resource('users', 'UserController');
// 其他资源路由...
});
别忘了在 app/Http/Kernel.php 的 $routeMiddleware 中注册:
'require.admin.login' => \App\Http\Middleware\RequireAdminLogin::class,
4. 补充:登录页路由必须放行
确保登录、验证码等无需认证的路由不在上述中间件保护范围内。推荐写法:
- 将
/admin/login、/admin/auth/login等显式排除在中间件外 - 或在中间件中加白名单判断:
if (in_array($request->path(), ['admin/login', 'admin/auth/login'])) { return $next($request); } - 使用 Laravel-admin 自带的
auth中间件时,它已处理登录页放行,但自定义中间件需手动兼容
不复杂但容易忽略的是:菜单隐藏 ≠ 权限拦截。必须同时做前端菜单过滤 + 后端路由拦截,否则游客仍可通过 URL 直接访问。











