Laravel Gate问题

时间:2018-08-18 17:02:11

标签: php laravel security authorization

我正在尝试使用Laravel中的Gates和Policies检查是否允许用户查看页面。在我的 web.php 中,我处于一条路由内:

$litter = Litter::find($id);

//Security gate
if(Gate::allows('edit-litter', Auth::user(), $litter)){
  return View::make('mykennel.litters.pupsheet')->with([
    //some variables
  ]);
}else{
  $ip_info = log_user_connection('Authorization Error');
  return View::make('errors.authorization')->with([
    'ip_info' => $ip_info,
    'litter_id' => $litter->id,
    'user_id' => Auth::user()->id,
    'litter_user' => $litter->user_id
  ]);
}

我的政策是这样的( AuthServiceProvider.php ):

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

      Gate::define('edit-litter', function ($user, $litter) {
          return $user->id == $litter->user_id;
      });
  }

当我对此进行测试时,我只会收到auth错误,因此我决定通过将上面的那些变量发送到错误视图来检查是否看不到东西,并且可以肯定的是,user_id等于litter_user(我正在比较的两件事):

{$litter_user}}, {{$user_id}} //returns '55, 55'

我缺少明显的东西吗?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

好像您是在以错误的方式检查能力

allows()函数需要两个参数,第一个是能力,第二个是参数数组

public function allows($ability, $arguments = [])
{
    return $this->check($ability, $arguments);
}

但是您将其称为:

Gate::allows('edit-litter', Auth::user(), $litter)

这可能是您的代码无法正常工作的原因

因此将其更改为:

Gate::allows('edit-litter', $litter) 

,然后重试,因为laravel会自动检查它是否已通过身份验证。