Laravel 5.7中如何限制API仅返回当前登录用户的对应信息?
解决方案
核心思路
你已经接入了auth:api中间件完成身份校验,当前登录用户的ID可以直接从请求上下文中获取,完全不需要通过URL传参,从根源上避免参数篡改风险。
步骤1:调整路由配置
修改api.php中的路由定义,去掉URL中的user_id参数:
<?php use Illuminate\Http\Request; Route::post('login', 'Auth\LoginController@login'); Route::post('logout', 'Auth\LoginController@logout'); Route::group(['middleware' => 'auth:api'], function() { Route::get('/user', function (Request $request) { return $request->user(); }); // 移除user_id路由参数 Route::get('/getOrder','OrderController@indexByUser'); });
步骤2:修改OrderController的indexByUser方法
不再接收URL传入的user_id参数,直接从认证实例中获取当前登录用户的ID查询订单:
public function indexByUser(Request $request) { // 直接获取当前登录用户的ID,不受外部传参影响 $userId = $request->user()->id; // 也可以用辅助函数 auth()->id() 获取 // $userId = auth()->id(); // 用该ID查询对应订单 $orders = Order::where('user_id', $userId)->get(); return response()->json($orders); }
可选校验方案(如需保留URL传参)
如果有特殊场景必须保留URL中的user_id参数,需要增加权限校验逻辑,不匹配时直接返回403错误:
public function indexByUser(Request $request, $userId) { // 校验传入的用户ID是否和当前登录用户ID一致,管理员可额外加判断放行 if ($userId != $request->user()->id && !$request->user()->is_admin) { return response()->json(['message' => '无权访问其他用户数据'], 403); } $orders = Order::where('user_id', $userId)->get(); return response()->json($orders); }
内容的提问来源于stack exchange,提问作者Mane Jiménez
相关产品推荐
相关产品推荐

