如何在 FormRequest 中保护属性免受某些用户的侵害?

How do I protect properties from certain users in a FormRequest?

提问人:Pekka 提问时间:1/29/2023 更新时间:1/30/2023 访问量:46

问:

我在 Laravel/Backpack 应用程序中有几个模型,其中对某些属性的写入访问权限仅限于某些用户角色。

假设我有一个具有以下属性的模型Client

  • name
  • phone
  • active
  • viewCount

我希望具有常规用户权限的用户能够编辑 和 属性,但不能编辑 和 。但是,管理员应该能够编辑 ,并且超级骗子管理员应该对 具有完全访问权限。namephoneactiveviewCountactiveviewCount

我已经在UI级别上解决了这个问题,现在想在后端实现基本的安全性。

我想静默地过滤掉(取消设置)当前用户不允许编辑但可能在请求中恶意设置的属性。

有人指出自定义类是这个的地方,但我有点迷茫如何实现它。FormRequest

我应该接受预先生成的

public function rules()
{
    return [
        'name' => 'nullable|string',
        'address' => 'required|string',
        .....

并根据当前用户的权限返回不同的验证规则数组?是否有取消设置字段的验证规则?

或者有没有一种更优雅的方式在课堂内处理这个问题?FormRequest

Laravel Laravel-formRequest

评论


答:

2赞 silver 1/30/2023 #1

您可以简单地为不同的用户角色传递额外的规则,只要您使用输入,所有输入都应该是好的,并且规则中未指定的任何输入都不会出现在验证结果中, e.i. 用于使用表单验证validated

public function rules() {
    $rules = [
        'name' => 'nullable|string',
        'address' => 'required|string',
    ];

    // Additional rule only for administrator or super admin
    if ( $this->user()->howEverYouFilterTheRole() )
        $rules['active'] = 'nullable';

    // additional rule only for superAdmin
    if ( $this->user()->howEverYouFilterTheRole() )
        $rules['viewCount'] = 'nullable';

    return $rules;
}

然后只是请求方法中的调用validated

public function store( WhatEverFormRequest $request ) {

    // Only contains field input specific in the rules;
    $validated = $request->validated();
}

或者根据要求直接应用规则

public function store( Request $request ) {

    $rules = [
        'name' => 'nullable|string',
        'address' => 'required|string',
    ];

    // Additional rule only for administrator or super admin
    if ( $request->user()->howEverYouFilterTheRole() )
        $rules['active'] = 'nullable';

    // additional rule only for superAdmin
    if ( $request->user()->howEverYouFilterTheRole() )
        $rules['viewCount'] = 'nullable';

    // Only contains inputs specified in rules
    $validated =  $request->validate( $rules );


}

您可以使用的另一个选项是规则;禁止 - 如果, 禁止 - 除非, 排除 - 如果排除 - 除非

评论

1赞 matiaslauriti 1/30/2023
我还建议使用 exclude_if,这样你就有一组规则,只需排除那些你不应该验证的规则,所以你最终会得到一个简单的数组