【问题标题】:Laravel 5.8 send parameters to authorize method FormRequest ClassLaravel 5.8 发送参数授权方法FormRequest类
【发布时间】:2020-04-21 02:52:14
【问题描述】:

我有 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 类中

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

【问题讨论】:

  • $permissionName 来自哪里?
  • 来自storeupdate方法

标签: php laravel laravel-5 laravel-5.8 laravel-authorization


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我不建议单独创建存储和更新请求,这样您最终会在两个不同的类中更新相同的规则/消息。
    【解决方案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 的默认帖子,请放置路线,那么这将对您有所帮助。

    【讨论】:

    • 它工作正常,但我认为这不是清晰的代码并且存在更好的方式
    猜你喜欢
    • 2020-04-20
    • 2017-06-25
    • 2019-09-07
    • 2019-08-01
    • 2020-01-30
    • 2020-05-22
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多