我在AppController中使用Security
组件。我需要构建一个检查表单输入,允许自定义格式化列表中的每个项目。为了实现这一点,我使用foreach处理$options
集合中的每个项目并创建新元素,如下所示:
foreach ($fileTypes as $fileType_key => $fileType_value) {
echo $this->Form->input(
'FilesIncluded.' . $fileType_key,
array(
'type' => 'checkbox',
'value' => $fileType_key,
'label' => false,
'div' => false,
'before' => '<span class="checkbox clearfix"><span class="check">',
'after' => '</span><label for="add-product-check-sub-cat">' . $fileType_value . '</label></span>',
'hiddenField' => false,
)
);
}
有几点需要注意:
data[FilesIncluded][{UUID}]
(其中UUID实际上代表了FilesIncluded的UUID),而不是data[FilesIncluded][]
$this->request->data
显示为$this->request->data['FilesIncluded']
,而不是$this->request->data['Model']['column']
我想弄清楚为什么会引发身份验证安全风险?当我将字段名称从'FilesIncluded.' . $fileType_key
更改为其中包含计数器的内容时,如'FilesIncluded.' . $count . '.id'
,它似乎无需抛出任何安全验证错误。任何想法如何使我的工作方式与我期待的方式相同?
更新
另一个问题是能够维护一组固定的FileTypes。例如,我希望能够控制可以从复选框中选择的HABTM记录。例如,我将显示以下列表: http://cl.ly/image/0b1Q3C0d0w1Y
只有当用户选择记录时,才会将它们存储为hasMany。然后,当需要编辑时,我希望不仅能够显示相同的记录集,而且还要将它们与用户保存的记录相关联。
答案 0 :(得分:2)
您可能收到了安全性错误,因为您要禁用hiddenField
复选框。安全组件在创建表单并进行比较时,根据表单字段的名称计算校验和,检查提交的表单是否有效(即篡改)这是在提交表单时收到的数据。
通过取消隐藏字段,如果未选中,则复选框将在发布的数据中不存在(未检查复选框永远不会以HTML格式发送)。如上所述,CakePHP根据期望的字段/输入和接收的实际字段(数据)计算校验和。 通过禁用hiddenField,根据发布的数据计算的校验和将取决于检查或不 的复选框,这将使发布的数据无效
可能有一些解决方法;
请勿取消隐藏'hiddenField'这将确保复选框始终出现在已发布的数据中。如果复选框未选中,则复选框的值将为0
(零)。如果复选框 ,则其发布的值将是复选框的指定值(如果未指定值,则为1
)
从校验和中排除自定义输入。您可以通过$this->Form->unlockField('fieldname');
从校验和中排除字段。在计算安全校验和时,CakePHP将忽略这些输入。
虽然这些变通办法可能有所帮助,但我建议不重新发明轮子。通过更改输入的名称,您将不再遵循CakePHP约定。遵守惯例通常会为您节省大量时间。
例如,可以通过一次Model::saveAssociated()
调用来保存相关的数据。如果正确设置了模型关系,例如:
Document->hasMany->UserFiles
,然后CakePHP将自动插入/更新Document
和UserFiles
数据。