[英]What is 'The right way' to authorize this REST API request?
我正在构建REST Api,而我坐在这里遇到了问题。 我绝不是这个主题的专家,所以我想学习如何以“正确的方式”(或至少以有意义的方式)解决REST体系结构。
我正在使用Angular前端和基于laravel的RESTfull后端API构建Web应用程序。 该应用程序具有以下3个表格:专辑,帖子和评论。 如果用户是该相册的成员,则可以在该相册中撰写帖子。
可以邀请用户成为相册的成员,然后查看其所有帖子以及这些帖子的评论。 如果用户不是(邀请成为)相册成员,则无法评论该相册中的帖子。
换句话说:如果用户对某个帖子发表评论,则该帖子必须来自该用户所属的相册。
我的难题是:如何检查/授权此请求?
我的雄辩的关系如下:
传入请求是具有2个参数的POST请求:
该帖子的作者通过Auth :: user()检索;
我最初针对此问题的想法是:
到目前为止,我的代码:
// 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应用程序中解决此问题?
提前致谢!
您正在寻找的whereHas
和exists
方式:
$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.