我使用自定义请求类来扩展 Laravavel FormRequest
(用户指南,API 文档)的顺序
- 验证输入参数,以及
- 授权请求。
骨架看起来像这样:
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 查询。
话虽如此,我本来期望以下事件顺序
- 用户身份验证(发生在中间件中,此处超出范围)
- 输入参数的验证(例如方法
rules
被调用) - 用户授权(例如方法
authorize
被调用)
但是,Laravel 以相反的顺序调用 2. 和 3.。因此,用户必须在输入还没有被验证的时候被授权。有问题的代码似乎在\Illuminate\Validation\ValidatesWhenResolvedTrait::validateResolved
. 该方法首先调用授权逻辑,然后调用输入验证。
建议的解决方案
现在,我考虑编写自己的基类,从覆盖中FormRequestWithBugfix
扩展它,以便它调用它更好地排序的方法,然后在整个项目中用作公共基类。FormRequest
validateResolved
FormRequestWithBugfix
问题:
- 建议的解决方案会奏效吗?是否有任何我应该注意的极端案例没有被提议的解决方案解决?
- Laravel 在第一步中以这种方式实现的原因是什么?我认为应该有充分的理由像 Laravel 那样做。
- 我应该注意哪些安全隐患?如果订单发生变化,潜在的缺点是什么?