You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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不变
            
        }
        
    }

}

问题解决思路与方案

核心问题分析

  1. 无限循环原因:重定向后的请求依然会被IsAdmin中间件拦截,每次执行都会重新触发智能卡校验与重定向逻辑,形成闭环。
  2. 参数传递错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:57:36