Laravel 5.8 将参数发送到授权方法 FormRequest Class

Laravel 5.8 send parameters to authorize method FormRequest Class

我有 updatestore 这样的方法

public function update(ContactRequest $request)
{
   if (Auth::user()->can('edit_contact'))
         $request->update();
   else 
        return $this->accessDenied();
}
public function store(ContactRequest $request)
{
   if (Auth::user()->can('add_contact'))
         $request->store();
   else 
        return $this->accessDenied();
}

authorizeFormRequest class

public function authorize()
{
    return   \Gate::allows('test', $this->route('contact'));
}

我想像这样将权限名称传递给 authorize 方法:

public function authorize($permissionName)
{
    if (Auth::user()->can($permissionName))
          return   \Gate::allows('test', $this->route('contact'));
}

在这样的控制器中

public function update(ContactRequest $request)
{
     $request->update('edit_contact');
}
public function store(ContactRequest $request)
{
     $request->store('add_contact');
}

没有直接将参数传递给表单请求的授权方法的方法,但您可以通过这种方式实现:

public function authorize()
{
    $method = Request::method();

    if($method == 'post') {
        $permission = 'add_contact';
    } elseif($method == 'put') {
        $permission = 'edit_contact';
    }

    if (Auth::user()->can($permission))
        return \Gate::allows('test', $this->route('contact'));
}

如果您使用的是 laravel 的默认值 post,请输入路由,这将帮助您解决问题。

最好为存储和更新发出两个不同的请求,无论如何你需要检查一些依赖于操作的值。 因此,您可以使用默认 laravel 的资源控制器策略方法,而不使用 Request::authorize 进行授权逻辑。 Laravel policy controller helpers

您有 3 个选项:

  1. 将您的授权方式更改为:

    public function authorize()
    {
        return $this->user()->can(
                $this->route()->getActionMethod() === 'store'
                    ? 'add_contact'
                    : 'edit_contact'
            )
            && \Gate::allows('test', $this->route('contact'));
    }
    
  2. 创建您的 authorize 请求方法 return true 并通过定义另一个门来检查授权并在您的控制器上调用它:

    public function authorize()
    {
        return true;
    }
    
    Gate::define('modify_contact', function ($user, $permissionName) {
        return $user->can($permissionName)
            && $user->can('test', $request->route('contact'));
    });
    
    public function update(ContactRequest $request)
    {
         Gate::authorize('modify_contact', 'edit_contact');
         //...
    }
    public function store(ContactRequest $request)
    {
         Gate::authorize('modify_contact', 'add_contact');
         //...
    }
    
  3. 以相同的方式定义和使用 policy,并将您的参数传递给它。