如何在CakePHP模型中创建可更新字段的白名单?

时间:2013-11-24 07:21:03

标签: cakephp model cakephp-2.3

我想创建一个我希望在CakePHP中可更新的字段白名单。我知道我可以在调用Model :: save()时传递一个fieldList数组,但这不是我想要的。我想要的是每个模型“发布”一个有效字段的列表,所以如果我调用没有fieldList的Model :: save()方法和不能更新的数据(如ownerId),这将不会更新。

我该怎么做才能得到这种行为?也许覆盖每个模型中的Model :: save方法来调用“原始”模型::使用白名单保存?我认为这是一个好主意,因为我没有污染所有具有大量重复白名单的控制器...

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

好的,谢谢大家的答案,但我错了:我不需要添加此功能。

我试图解决的问题是安全问题,我试图避免形式篡改(我刚才发现了这个名字),而且我是CakePHP用户的新手,我不知道 CakePHP已经解决了这个问题

我的问题的答案非常简单:我必须使用CakePHP的安全插件并使用表格篡改预防(http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html#form-tampering-prevention)。

答案 1 :(得分:0)

不能说我曾经需要在CakePHP中执行此操作,但CakePHP只保存您传递的字段。

如果真的需要创建一个白名单,并且您某些,那么希望这些字段保存并从来没有你的数据库中的任何其他人(虽然我不明白为什么你有它们的列,如果你从来没有触摸它们)然后你可以在模型回调方法中模拟这种行为:

<?php
class User extends AppModel {

    public function beforeSave($options = array()) {
        $whitelist = array('first_name', 'last_name', 'email');

        foreach ($this->data[$this->alias] as $field => $value) {
            if (!in_array($field, $whitelist)) {
                unset($this->data[$this->alias][$field]);
            }
        }

        return true;
    }
}

这将取消设置不在$whitelist数组中的任何数据,但如果您确实不希望更新列,则不要为其传递值。