提问人:Pekka 提问时间:1/29/2023 更新时间:1/30/2023 访问量:46
如何在 FormRequest 中保护属性免受某些用户的侵害?
How do I protect properties from certain users in a FormRequest?
问:
我在 Laravel/Backpack 应用程序中有几个模型,其中对某些属性的写入访问权限仅限于某些用户角色。
假设我有一个具有以下属性的模型Client
name
phone
active
viewCount
我希望具有常规用户权限的用户能够编辑 和 属性,但不能编辑 和 。但是,管理员应该能够编辑 ,并且超级骗子管理员应该对 具有完全访问权限。name
phone
active
viewCount
active
viewCount
我已经在UI级别上解决了这个问题,现在想在后端实现基本的安全性。
我想静默地过滤掉(取消设置)当前用户不允许编辑但可能在请求中恶意设置的属性。
有人指出自定义类是这个的地方,但我有点迷茫如何实现它。FormRequest
我应该接受预先生成的
public function rules()
{
return [
'name' => 'nullable|string',
'address' => 'required|string',
.....
并根据当前用户的权限返回不同的验证规则数组?是否有取消设置字段的验证规则?
或者有没有一种更优雅的方式在课堂内处理这个问题?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
,这样你就有一组规则,只需排除那些你不应该验证的规则,所以你最终会得到一个简单的数组
评论