0

我使用自定义请求类来扩展 Laravavel FormRequest用户指南API 文档)的顺序

  1. 验证输入参数,以及
  2. 授权请求。

骨架看起来像这样:

class MyRequest extends FormRequest {
  /**
   * Determines if the user is authorized to make this request.
   */
  public function authorize(): bool {
    // TODO: Put your authorization logic here
  }

  /**
   * Returns the validation rules that apply to the request.
   */
  public function rules(): array
  {
    // TODO: Define your validation rules here
  }
}

通常,特别是在我的情况下,用户是否有权发出请求的决定取决于输入参数。因此,我希望先验证输入参数的语法,然后再授权请求。特别是,为了获得适当的授权,经常需要使用请求的输入参数运行 DB 查询。显然,只有在输入参数的语法已经过验证的情况下,才应该执行 DB 查询。

话虽如此,我本来期望以下事件顺序

  1. 用户身份验证(发生在中间件中,此处超出范围)
  2. 输入参数的验证(例如方法rules被调用)
  3. 用户授权(例如方法authorize被调用)

但是,Laravel 以相反的顺序调用 2. 和 3.。因此,用户必须在输入还没有被验证的时候被授权。有问题的代码似乎在\Illuminate\Validation\ValidatesWhenResolvedTrait::validateResolved. 该方法首先调用授权逻辑,然后调用输入验证。

建议的解决方案

现在,我考虑编写自己的基类,从覆盖中FormRequestWithBugfix扩展它,以便它调用它更好地排序的方法,然后在整个项目中用作公共基类。FormRequestvalidateResolvedFormRequestWithBugfix

问题

  1. 建议的解决方案会奏效吗?是否有任何我应该注意的极端案例没有被提议的解决方案解决?
  2. Laravel 在第一步中以这种方式实现的原因是什么?我认为应该有充分的理由像 Laravel 那样做。
  3. 我应该注意哪些安全隐患?如果订单发生变化,潜在的缺点是什么?
4

0 回答 0