Laravel 10自定义中间件中如何返回带错误信息的重定向?
解决方案
问题分析
你遇到的“无法访问网站”大概率是循环重定向导致的:当用户权限不匹配时,若尝试重定向回上一页,但上一页同样受CheckUserRole中间件保护,就会陷入无限循环,浏览器因此提示无法访问。另外你的角色查询逻辑也可以简化,减少不必要的操作。
修正后的代码
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Symfony\Component\HttpFoundation\Response; class CheckUserRole { public function handle(Request $request, Closure $next, $role): Response { // 先判断用户是否登录 if (!Auth::check()) { // 未登录直接重定向到登录页,附带来源URL return redirect()->route('login')->with('error', '请先登录'); } $requiredRole = ltrim($role, ':'); $authUser = Auth::user(); // 前提:在User模型中定义与Role的关联 // public function role() { return $this->belongsTo(\App\Models\Roles::class); } $userRoleName = $authUser->role->name; if ($userRoleName === $requiredRole) { return $next($request); } // 权限不匹配时,重定向到不受该中间件限制的页面,比如首页或无权限提示页 return redirect()->route('home')->with('error', '你没有访问该页面的权限'); } }
关键修改点
- 解决循环重定向:放弃使用
redirect()->back(),改为重定向到明确的、不受该中间件保护的路由(比如首页home),或者专门的无权限提示页面。 - 简化角色查询:通过Eloquent关联
$authUser->role->name直接获取角色名,比手动查询Roles模型更简洁高效,需要先在User模型中添加关联:// 在App\Models\User中添加 public function role() { return $this->belongsTo(\App\Models\Roles::class); } - 传递并展示错误信息:用
with('error', 'xxx')将错误信息存入session,前端可以通过Blade模板获取并展示:@if(session('error')) <div class="alert alert-danger"> {{ session('error') }} </div> @endif - 提前处理未登录场景:在逻辑最开始判断用户是否登录,避免后续无效操作。
内容的提问来源于stack exchange,提问作者Mohan
相关产品推荐
相关产品推荐

