Laravel 5.8 发送参数以授权方法 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();
}

FormRequestauthorize

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');
}

您有 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方法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. 以相同的方式定义和使用策略,并将参数传递给它。

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

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 的默认帖子,请放置路线,那么这将对您有所帮助。

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

最新更新