Php 保护模型的最佳方法->;从保存错误输入中加载()
在yii2应用程序中,我有Php 保护模型的最佳方法->;从保存错误输入中加载(),php,security,model,yii2,Php,Security,Model,Yii2,在yii2应用程序中,我有用户型号。例如,我有字段name和is_admin(0或1)。 当用户注册时,他只输入name 他有user/update页面来编辑他的姓名。但是,如果您是管理员,您也可以编辑everyones页面并设置is_admin字段(对于管理员,它在页面上可见) 规则如下: public function rules() { return [ ['name', 'string'], ['is_admin', 'integer'],
用户
型号。例如,我有字段name
和is_admin
(0或1)。
当用户注册时,他只输入name
他有user/update
页面来编辑他的姓名
。但是,如果您是管理员,您也可以编辑everyones页面并设置is_admin
字段(对于管理员,它在页面上可见)
规则如下:
public function rules()
{
return [
['name', 'string'],
['is_admin', 'integer'],
];
}
Q:如何通过放置另一个
页面来保护操作不受用户在用户/更新
页面中设置管理员的能力的影响
这意味着每个人都可以将输入属性name=“User[name]”
替换为name=“User[is\u admin]”
,并将值设置为1
。然后$model->load(Yii::$app->request->post())
自动设置is_admin
var
是的,我可以在$\u POST
中手动清空is_admin
,但在实际项目中,我在db表中有20多个字段和许多操作,每次都很难检查每个视图中的输入并进行比较
控制器:
$model = User::findIdentity($id);
if ($model->load(Yii::$app->request->post())) {
if ($model->save())
...
}
使用
场景
。例如:
在您的型号中
const SCENARIO_USER_SAVE='USER SAVE';//任何你想称之为场景的东西
公共功能场景()
{
返回[
self::SCENARIO_USER_SAVE=>[“field1”、“field2”],//仅列出允许用户更新的字段
];
}
现在在您的控制器中
使用该场景
$model=User::findIdentity($id);
$model->scenario=User::scenario\u User\u SAVE;//使用场景
如果($model->load(Yii::$app->request->post()){
如果($model->save())
...
}
注意当您这样做时,场景中不允许的字段将具有
NULL
值$model->load(Yii::$app->request->post())
无论您通过表单发送什么
更新:调用
$model->save()
时,场景中不允许的其他字段将不会更新/保存(我已经测试过了)
此处的详细指南:您可以在验证之前使用
ActiveRecord
,在这种情况下,类似于:
class User extends ActiveRecord
{
public function beforeValidate(){
//If User Role is Not Admin $user is User ActiveRecord Object
if($user->role === 'user'){
$this->is_admin = 0;
}
parent::beforeValidate();
}
}
“场景中不允许的字段将具有空值”-这意味着如果用户无法设置is_admin
,此字段is_admin
将设置为NULL
?是。据我所知,它将不会更新,它将保持不变。谢谢您的回复。你们知道我可以在场景中设置你们不能更新的字段列表(而不是你们可以更新的列表)吗?我认为这是可能的。我自己没做过,所以不能确切地告诉你是怎么做的。