
laravel 中间件仅作用于显式声明其所属路由组内的路由;独立定义的 `/dashboard` 路由未被包含在 `middleware => ['checksignedin']` 的路由组中,因此绕过校验。解决方案是将该路由移入中间件保护的分组内。
在 Laravel 8 中,中间件仅对明确置于其作用域内的路由生效。你当前的路由定义存在一个关键逻辑断层:
// ❌ 错误:/dashboard 独立定义,未受中间件保护
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
// ✅ 正确:所有 dashboard 相关路由(含根路径 /)统一纳入中间件分组
Route::group(['prefix' => 'dashboard', 'middleware' => ['checkSignedIn']], function () {
Route::get('/', [DashboardController::class, 'index'])->name('dashboard'); // ← 关键:使用 '/' 作为组内根路径
Route::get('/users', [UsersController::class, 'index']);
Route::get('/create-user', [UsersController::class, 'create']);
Route::get('/delete-user/{id}', [UsersController::class, 'delete']);
});为什么原写法不生效?
- Route::get('/dashboard', ...) 是一条顶层独立路由,完全游离于 Route::group(...) 之外;
- 即使 group 的 prefix => 'dashboard' 看似“覆盖”了该路径,Laravel 不会自动合并或继承中间件到外部路由;
- 因此,用户直接访问 /dashboard 时,CheckSignedIn 中间件根本不会执行。
补充建议:优化中间件健壮性
当前中间件中硬编码带 Cloudflare 邮箱混淆的 HTML 片段(如 )存在严重隐患:
✅ 应解密并存储纯邮箱字符串(教程中该混淆是前端反爬机制,后端需解析真实邮箱);
✅ 建议改用配置文件管理白名单,提升可维护性:
// config/auth.php 或自定义 config/allowed-users.php
'allowed_emails' => [
'admin@example.com',
'dev@example.com',
'manager@example.com',
],并在中间件中读取:
use Illuminate\Support\Facades\Config;
public function handle(Request $request, Closure $next)
{
$userEmail = session('userEmail');
$allowed = Config::get('allowed-users.allowed_emails', []);
if (empty($userEmail) || !in_array($userEmail, $allowed)) {
return redirect('/')->with('error', 'Access denied: insufficient permissions.');
}
return $next($request);
}总结
- ✅ 路由分组是中间件作用域的边界,所有需保护的路径必须显式写入该分组;
- ✅ 将 /dashboard 改为 Route::get('/', ...) 并置于分组内,是解决本问题的最小必要修改;
- ✅ 避免在代码中硬编码混淆后的邮箱 HTML,确保校验逻辑基于原始、可信的邮箱字符串;
- ✅ 结合 session() 校验时,务必增加空值判断(empty($userEmail)),防止 in_array(null, [...]) 返回 false 导致意外放行。
完成上述调整后,未登录或非授权用户访问 /dashboard 及其子路径时,将被正确重定向至首页。











