在laravel 5.8中仅显示当前经过身份验证的用户订单

时间:2019-04-08 12:08:37

标签: php laravel authentication eloquent

我正在为android开发人员创建一个API,使其能够显示用户的订单。我的代码使任何用户都可以显示任何产品,我想要的只是显示经过身份验证的用户的订单

我已经保护了这样的路线:


Route::middleware('auth:api')->group( function () {
    Route::resource('orders', 'API\OrdersController');
});

,我在请求上使用以下标头:

'headers' => [    'Accept' => 'application/json',    'Authorization' => 'Bearer '.$accessToken,]

这是show($ id)方法的控制器代码

public function show($id)
{
    $user = Auth::id();
    $Orders = Orders::where('id',$id)->where('order_shopper_id', $user)->get();
    if (is_null($Orders) || empty($Orders)) {
        return $this->sendError('Orders not found.');
    }
    return $this->sendResponse($Orders->toArray(), 'Orders retrieved successfully.');
 }

它可以正常工作,但是例如当我尝试访问订单号“ 2”并且经过身份验证的用户未创建该订单时,它仍然会返回成功且空数据。

我要的是,“选择订单号(#),但要确保登录的用户创建的订单不是别人创建的,如果没有返回未经身份验证的话”

谢谢。

3 个答案:

答案 0 :(得分:2)

QueryBuilder::get()方法返回一个集合,一个空集合仍然是一个集合对象,因此$Orders永远不会为null或为空。

尝试:

if (!$Orders->count()) {
    return $this->sendError('Orders not found.');
}

答案 1 :(得分:1)

如果您基于令牌对用户进行身份验证,则必须通过以下方式获取经过身份验证的用户ID:

$user = Auth::guard('api')->id();

然后像@kiske所说的那样更改if语句。

答案 2 :(得分:0)

尝试

if($Orders->isEmpty()){
 return $this->sendError('Orders not found.');
}