【问题标题】:Showing only current authenticated user orders in laravel 5.8在 laravel 5.8 中仅显示当前经过身份验证的用户订单
【发布时间】:2019-08-29 14:03:52
【问题描述】:

我正在为 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”并且经过身份验证的用户没有创建该订单时,它仍然返回成功且数据为空。

我想要的是,“选择订单号 (#),但请确保登录用户创建了该订单而不是其他人,如果没有返回未验证”

提前谢谢你。

【问题讨论】:

  • $user 中有什么内容?你能检查一下吗?返回它,看看它是否为空。
  • 返回当前认证的用户id
  • 只要用这个if ($Orders)就行了。
  • 它返回或者你期望它返回用户ID?因为我认为你必须使用 api guard。
  • 我用Postman测试过,只要我用的是token,它就会返回id,我用的是api guard。不过我会查一下,看看我是否应该使用它。

标签: php laravel authentication eloquent


【解决方案1】:

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

试试:

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

【讨论】:

  • 这不是我想要的,但它确实起到了作用
【解决方案2】:

试试

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

【讨论】:

    【解决方案3】:

    如果你基于token对用户进行身份验证,你必须通过这种方式获取经过身份验证的用户id:

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

    并按照@kiske 所说的那样更改if 声明。

    【讨论】:

    • 我确实根据令牌对用户进行身份验证,但我没有使用这种方式,它仍在工作,但无论如何我会查一下
    猜你喜欢
    • 2021-03-23
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2019-12-16
    • 2016-06-30
    • 2020-01-14
    相关资源
    最近更新 更多