Laravel - 如何避免用户看到不属于他们的内容(以及关系)

时间:2015-12-10 14:13:55

标签: php laravel authorization relationship

在Laravel 5.1项目中,我有:

属于用户页面页面

视频。 我想确保用户不能拥有他们所拥有的视频和网页。管理员用户可以查看所有页面和视频。

如何解决这个问题?

我已经在使用中间件并将用户ID作为参数传递,但我不知道如何在Video Constructor中获取用户ID。 我可能需要像Constructor Injection这样的东西,但文档并不是很清楚。

编辑: 根据@tommy的建议,我使用了Laravel授权来检查用户是否拥有权限。 我决定使用单个存储库,因为检查总是相同的(与用户匹配的页面)

在\ App \ Providers \ AuthServiceProvider

public function boot(GateContract $gate)
{
    $this->registerPolicies($gate);

    $gate->define('check-owner', function ($user, $page) {
        return $user->id === $page->user_id;
    });
}

在App \ Repositories \ OwnerRepository

namespace App\Repositories
use App\Page;
use Gate;
   class OwnerRepository
   {
      public function CheckifOwns(Page $page){
         if (Gate::denies('check-owner', $page)) 
         {
           abort(403, 'Unauthorized action.');
         }
      }
   }

在视频控制器中

use App\Repositories\OwnerRepository;
private $repository;

public function __construct(OwnerRepository $repository)
{
    $this->repository = $repository;
    $this->middleware('auth');
}
public function show($id)
{
    $video= Video::findOrFail($id);
    $this->repository->CheckifOwns($video->Page);
    return view('videos.view',compact('video'));
}

1 个答案:

答案 0 :(得分:2)

Laravel 5.1.11引入了新的授权系统。您可以使用Policies轻松检查是否允许用户访问特定资源:

http://laravel.com/docs/5.1/authorization