2016-04-22 77 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變量將爲空。但我想要更多的聲明方式,例如laravel請求,因爲我需要在showupdatedestroy方法中進行相同的檢查。但我不能用laravel要求,因爲檢查是這樣的

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

任何人都可以提出如何實現我的目標?

+0

我找到解決的http://計算器。 COM /問題/ 22618389/laravel,防止用戶從 - 編輯 - 查看 - 其他用戶資源?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')); 
    } 
}