2016-04-22 80 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')); 
    } 
}