Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 保护模型的最佳方法->;从保存错误输入中加载()_Php_Security_Model_Yii2 - Fatal编程技术网

Php 保护模型的最佳方法->;从保存错误输入中加载()

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'],

在yii2应用程序中,我有
用户
型号。例如,我有字段
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
?是。据我所知,它将不会更新,它将保持不变。谢谢您的回复。你们知道我可以在场景中设置你们不能更新的字段列表(而不是你们可以更新的列表)吗?我认为这是可能的。我自己没做过,所以不能确切地告诉你是怎么做的。