2016-04-22 11 views
0

に属しマイUser.phpLaravelの検証サイトでは、ユーザー

class User extends Authenticatable 
{ 
    public function sites() 
    { 
     return $this->hasMany(Site::class); 
    } 
} 

マイSite.php

class Site extends Model 
{ 
    public function user() 
    { 
     return $this->belongsTo(User::class); 
    } 
} 

マイroutes.php

Route::resource('site', 'SiteController'); 

マイSiteController.php

class SiteController extends Controller 
{ 
    public function edit(int $id) 
    { 
     $site = Auth::user()->sites()->find($id); 

     return view('site.edit', compact('site')); 
    } 
} 

サイトがユーザーのものであることを確認するにはどうすればよいですか?私は私の場合、サイトがユーザーに属していない場合、$site変数がnullになることを理解しています。しかし、私はshowupdate、およびdestroyのメソッドで同じチェックが必要なので、より多くの宣言的な方法、laravel要求のようなものが必要です。しかし、私はlaravelリクエストを使用することはできません。チェックはこのようなものなので、

$siteId = Route::current()->param('site'); 
$ids = Auth::user()->sites()->pluck('id')->toArray(); 
$result = in_array($siteId, $ids); 

誰も私の目標を達成する方法を提案できますか?

+0

私は解決策はhttp見つける://のstackoverflowを。 com/questions/22618389/laravel-prevent-users-editing-viewing-other-users-resources?rq = 1。ルートフィルタを使用するだけです。 – melihovv

答えて

0

私はlaravel 5.2を使用しているので、ルートフィルタを備えたソリューションは推奨されません。経路フィルタではなく、ミドルウェアを使うべきです。
アプリ/ HTTP /ミドルウェア/ RestrictPermission.php

class RestrictPermission 
{ 
    public function handle($request, Closure $next) 
    { 
     $siteId = Route::current()->parameter('site'); 

     if (!Auth::user()->sites()->find($siteId)) { 
      abort(403); 
     } 

     return $next($request); 
    } 
} 

アプリ/ HTTP/Kernel.php

class Kernel extends HttpKernel 
{ 
    protected $routeMiddleware = [ 
     'restrict.permission' => RestrictPermission::class, 
    ]; 
} 

SiteController.php

class SiteController extends Controller 
{ 
    public function __construct() 
    { 
     $this->middleware('restrict.permission', ['except' => [ 
      'index', 'create', 'store', 
     ]]); 
    } 

    public function edit(int $id) 
    { 
     $site = Auth::user()->sites()->find($id); 
     return view('site.edit', compact('site')); 
    } 
} 
関連する問題