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
相关产品推荐
相关产品推荐

