繁体   English   中英

授权此REST API请求的“正确方法”是什么?

[英]What is 'The right way' to authorize this REST API request?

我正在构建REST Api,而我坐在这里遇到了问题。 我绝不是这个主题的专家,所以我想学习如何以“正确的方式”(或至少以有意义的方式)解决REST体系结构。

我正在使用Angular前端和基于laravel的RESTfull后端API构建Web应用程序。 该应用程序具有以下3个表格:专辑,帖子和评论。 如果用户是该相册的成员,则可以在该相册中撰写帖子。

可以邀请用户成为相册的成员,然后查看其所有帖子以及这些帖子的评论。 如果用户不是(邀请成为)相册成员,则无法评论该相册中的帖子。

换句话说:如果用户对某个帖子发表评论,则该帖子必须来自该用户所属的相册。

我的难题是:如何检查/授权此请求?

我的雄辩的关系如下:

  • 用户表与相册有很多关系
  • 相册有很多帖子
  • 帖子有很多评论

传入请求是具有2个参数的POST请求:

  • album_id(帖子所在的相册)
  • post_id(针对正在评论的帖子)
  • 正文(实际评论本身)

该帖子的作者通过Auth :: user()检索;

我最初针对此问题的想法是:

  1. 我检查用户所属的所有相册
  2. 建立一个数组,其中包含用户所属成员的已找到相册的ID
  3. 检查post_id参数是否在该数组中
  4. 如果不是,则用户无法评论;如果是,则用户可以评论

到目前为止,我的代码:

// Validate the Request Body
$input = $this->request->only([ 'album_id', 'post_id', 'comment' ]);

$validator = Validator::make( $input, [

    'album_id'  => 'required|integer',
    'post_id'   => 'required|integer',
    'comment'   => 'required',

]);

// Authorize the Request
$albumIdList = Auth::user()->albums()->get()->pluck('id')->toArray();

$postIdList = Post::whereIn( 'album_id', $albumIdList )->select('id')->get()->toArray();

if( ! in_array($this->request->get('post_id'), $albumIdList))
    return abort(403);

// Store the new comment
$comment = Comment::create([

    'user_id'   => Auth::user()->id,
    'post_id'   => $input['post_id'],
    'comment'   => $input['comment'],

]);

return $comment;

我认为这工作正常,但是如果相册中有1000条帖子怎么办? 建立带有所有帖子ID的数组对于服务器来说真的很费劲……专业公司(如Facebook,Twitter,Pinterest)将如何在其Web应用程序中解决此问题?

提前致谢!

您正在寻找的whereHasexists方式:

$allowed = Auth::user()->albums()->whereHas('post', function ($query) {
    $query->where($this->request->only('post_id'));
})->exists();

另外,没有理由传递album_id 您的代码可以简化为:

$this->validate($this->request, [
    'post_id' => 'required|integer',
    'comment' => 'required',
]);

$allowed = Auth::user()->albums()->whereHas('posts', function ($query) {
    $query->where($this->request->only('post_id'));
})->exists();

if (! $allowed) return abort(403);

$input = $this->request->only('post_id', 'comment');

return Comment::create($input + ['user_id' => Auth::id()]);

如果您想进一步清理,请查看Laravel的授权工具

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM