繁体   English   中英

Laravel 5.8 发送参数授权方法 FormRequest 类

[英]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();
}

并在FormRequest类中authorize

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 策略控制器助手

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM