Laravel自定义中间件重定向无限循环问题咨询
自定义IsAdmin中间件重定向循环与URL更新问题
我正在开发自定义IsAdmin中间件,根据用户角色返回对应视图:验证通过时返回带参数的视图,不通过时返回无参数视图。目前直接返回视图可正常运行,但地址栏URL不会改变;尝试用redirect()->route()重定向时会陷入无限循环。
仅welcome路由未被中间件覆盖,数据来自智能卡用于身份验证,不使用默认auth机制。我已理解$next($request)的作用并修改中间件逻辑,同时移除了路由中的auth中间件,但仍需解决如何实现带参数重定向且更新地址栏URL的问题。
路由配置
Route::get('/welcome', 'MembersController@welcome')->name('welcome');//随时可访问 Route::get('/index', "MembersController@index")->name('index')->middleware(['IsAdmin']); Route::post('/store', "MembersController@store")->name('store')->middleware(['IsAdmin']); Route::patch('/update/{id}', "MembersController@update")->name('update')->middleware(['IsAdmin']); Route::delete('/delete/{id}', "MembersController@destroy")->name('destroy')->middleware(['IsAdmin']); Route::get('/show/{id}', "MembersController@show")->name('show')->middleware(['IsAdmin']);
中间件代码
public function handle($request, Closure $next) { $path = "C:/xampp/htdocs/EIDReader/public/EIDReaderApi/"; $imageName = "avatar.jpg"; $data = new \stdClass(); $data->output = ""; $data->retval = ""; $data->personData = null; exec("C:/xampp/htdocs/EIDReader/public/EIDReader.exe", $data->output, $data->retval); if($data && $data->output && !empty($data->output[8]) && isset($data->output[8])){ $personData = json_decode(str_replace("'", "", $data->output[8])); $folderPath = $data->output[4]; $index = strrpos($folderPath, "/"); $personImageFolder = substr($folderPath, $index+1); $imageName = "avatar.jpg"; $imagePath = $personImageFolder."/".$imageName; $member = Members::where([["docRegNo", "=", $personData->docRegNo], ["personalNumber", "=", $personData->personalNumber]])->first(); if($member && $member->role_id && $member->role_id==1){ $members = Members::paginate(5); //return redirect()->route("index", [$members]);//无效,陷入无限循环 return response()->view("pages.index", compact("members"));//有效,但地址栏URL不变 } else{ //return redirect()->route("welcome");//无效,陷入无限循环 return response()->view("welcome");//有效,但地址栏URL不变 } } }
问题解决思路与方案
核心问题分析
- 无限循环原因:重定向后的请求依然会被IsAdmin中间件拦截,每次执行都会重新触发智能卡校验与重定向逻辑,形成闭环。
- 参数传递错误:
redirect()->route("index", [$members])用法错误,分页集合无法直接作为路由参数传递,路由参数仅支持简单键值对。
具体修复步骤
1. 重构中间件,回归权限校验职责
中间件只负责权限验证,不处理数据查询与视图返回,验证通过后放行请求到控制器:
public function handle($request, Closure $next) { $path = "C:/xampp/htdocs/EIDReader/public/EIDReaderApi/"; $data = new \stdClass(); $data->output = []; $data->retval = 0; exec("C:/xampp/htdocs/EIDReader/public/EIDReader.exe", $data->output, $data->retval); // 校验智能卡数据有效性 if(empty($data->output) || !isset($data->output[8]) || empty($data->output[8])){ return redirect()->route("welcome"); } $personData = json_decode(str_replace("'", "", $data->output[8])); $member = Members::where([ ["docRegNo", "=", $personData->docRegNo], ["personalNumber", "=", $personData->personalNumber] ])->first(); // 校验用户角色权限 if(!$member || $member->role_id != 1){ return redirect()->route("welcome"); } // 将验证通过的用户信息存入请求,供控制器使用 $request->merge(['member' => $member]); // 放行请求到对应控制器方法 return $next($request); }
2. 控制器负责数据查询与视图渲染
修改MembersController的index方法,处理分页数据查询与视图返回:
public function index() { $members = Members::paginate(5); return view("pages.index", compact("members")); }
3. 带参数重定向的正确方式
如果需要传递参数到目标路由,仅支持简单类型(如ID、字符串),示例:
// 重定向到带用户ID的show路由 return redirect()->route("show", ['id' => $member->id]);
复杂数据(如分页集合)需在目标控制器方法中自行查询,不要通过重定向传递。
内容的提问来源于stack exchange,提问作者Veljko Stefanovic
相关产品推荐
相关产品推荐

