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

Laravel中间件传参:能否传入请求变量验证用户是否发起请求?

如何在Laravel中间件中传入请求变量并验证用户权限?

当然可以把请求变量传入Laravel中间件,而且你的场景正好需要这么做——毕竟你要验证当前登录用户是不是这个请求的申请人或负责人,肯定得拿到路由里的richiesta实例对吧?

先看你现在的中间件代码,你是硬编码检查用户ID是1或2,这显然只是临时测试用的,没法满足实际业务需求。下面给你改成动态判断的正确写法:

步骤1:确保路由参数能拿到请求实例

你的路由里用了{richiesta}参数,最好开启路由模型绑定(Laravel默认支持),这样Laravel会自动把对应的Richiesta模型实例注入到请求中,不用你手动查数据库。如果你的模型类名是Richiesta,参数名是richiesta,那已经符合要求了,不用额外配置。

步骤2:修改中间件逻辑

直接在中间件的handle方法里,从请求对象中获取路由参数对应的模型实例,然后判断用户权限:

public function handle($request, Closure $next) {
    $user = \Auth::user();
    
    // 先判断用户是否已登录
    if (!$user) {
        $request->session()->flash('message.level', 'danger');
        $request->session()->flash('message.content', '请先登录!');
        return redirect('/login');
    }

    // 获取路由中的请求模型实例
    $richiesta = $request->route('richiesta');

    // 验证当前用户是申请人还是负责人(这里的字段名根据你的实际数据库结构调整)
    if ($user->id == $richiesta->richiedente_id || $user->id == $richiesta->incaricato_id) {
        return $next($request);
    } else {
        $request->session()->flash('message.level', 'danger');
        $request->session()->flash('message.content', '你无法查看此页面,必须是申请人或负责人!');
        return redirect('/home');
    }
}

补充说明

  • 如果你的Richiesta模型里存储申请人/负责人的字段名不是richiedente_id和incaricato_id,记得改成你实际的字段名。
  • 要是你没开启路由模型绑定,也可以手动通过ID查询模型:
    $richiestaId = $request->route('richiesta');
    $richiesta = \App\Models\Richiesta::findOrFail($richiestaId);
    
    不过路由模型绑定更简洁,推荐使用。

内容的提问来源于stack exchange,提问作者Carmine Rub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:32:38