2013-11-24 103 views
1

我想创建一个我想在CakePHP中更新的字段的白名单。我知道我可以在调用Model :: save()时传递一个fieldList数组,但这不是我正在寻找的。我想要的是每个模型都“发布”有效字段的列表,所以如果我调用Model :: save()方法而不使用fieldList并且数据不能更新(如ownerId),那么不会被更新。如何在CakePHP模型中创建可更新字段的白名单?

我该怎么做才能得到这种行为?也许可以在每个模型中重写Model :: save方法以在“原始”Model :: save中调用白名单?我认为这是一个好主意,因为我不会污染所有带有大量重复白名单的控制器...

感谢您的帮助!

+0

这听起来像是一个行为的用例:http://book.cakephp.org/2.0/en/models/behaviors.html – dhofstet

+0

你确定这一定是一种行为吗?每个字段的白名单必须不同,并且必须为所有应用的模型完成此操作... –

+0

我不确定我是否获得了您想要实现的内容。你想“锁定”某些领域从未被更新?如果您不在表单中为其添加字段,则字段将不会更新。如果您只想在表单中显示数据,只需将该字段设置为禁用,即显示数据,但不会在$ this-> request-> data中设置,因此不会更新。 – Oldskool

回答

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阵中,但如果你真的不想要列正在更新那么不要为它传递一个值。

+0

马丁,它只是为了安全。我的模型中有不应更新的字段。如您所知,您可以在发送表单前“调整”网站并添加更多字段(输入)或值。我想要的是避免这个问题。例如:我所有的模型都有一个companyId字段。这个字段在我创建的行为中被beforeUpdate回调填充,并且这个字段不应该被更新,从不。这是一次写入/只读字段。如果我不用白名单保护我的模型,任何人都可以在表单中添加companyId字段,按下发送按钮,并且此字段已更改...您是否理解我? –

+2

是的,我理解用例,我相信我们都能够指出你在正确的方向(在这种情况下,安全组件)你是否给出了这个问题,而不是如何实现你的解决方案已经在你的原始文章中决定(域名白名单)。 –

+0

马丁,你是完全正确的:我的问题完全不正确。我没有说出问题,而是在寻找如何实施“我的”(错误的)解决方案。无论如何,谢谢你回答:) –

2

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

我试图解决的问题是一个安全问题,我试图避免形式篡改(我刚刚发现了这个名称),并且由于我是新手CakePHP用户,所以我不知道CakePHP已经管理这个问题

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

+0

感谢您发布的答案。任何人发现这一点:根据我的理解,为了启用基本的篡改保护,你需要做的就是向你的控制器添加'public $ components = array('Security');'。文档页面不是特定的,如果这是所有你必须做的,但从快速测试我可以得出结论,添加,只有一条线的作品。 –

相关问题