Laravel保护子对象的策略

时间:2019-05-13 13:18:52

标签: laravel policies

我有一个关于Laravel政策的快速问题。我正在编写一个非常简单的API。我有一个带有一些GET端点的Podcast对象:

GET /api/podcasts => returns all podcasts
GET /api/podcasts/{podcast} => returns a given podcast

我正在使用绑定到Podcast模型的策略。我在$this->authorizeResource(Podcast::class);类的构造函数中使用了PodcastController。一切正常,我只能访问自己的播客!

现在,我有子对象,例如文件。所以我创建了一个新的端点:

GET /api/podcasts/{podcast}/files/{file} => returns a specific file of a podcast

我已经将$this->authorizeResource(Podcast::class);添加到FileController类的构造函数中。这样做,我不能在URL中输入任何播客ID,只能输入我自己的ID,这很好。但是,我可以在URL中输入任何文件ID,包括不属于我的播客拥有的文件。例如:

GET /api/podcasts/1/files/3

播客#1是我的,这很好。但是文件#3属于播客#2(不是#1),这不是我的。此时,我应该获得未经授权的访问。

有什么主意吗?谢谢

Axel

1 个答案:

答案 0 :(得分:0)

我实际上找到了解决方案的开始,但发现它很脏。我写了一个明确的模型绑定条件:

        Route::bind('file', function($value, $router) {
            return File::where('podcast_id', $router->parameter('podcast'))->findOrFail($value);
        });

你们怎么看? 谢谢