我的CakePHP 2.6应用程序中有一个表单,它有多个按钮可以将表单提交给不同的操作。使用Cake 2.4,这很有效,但在2.6提交到默认表单操作以外的任何内容时会导致出现黑洞'auth'
错误。
在我的表单结束之前,我有多个提交按钮,如下所示:
echo $this->Form->button('Default', array(
'type' => 'submit',
));
echo $this->Form->button('Alternate 1', array(
'type' => 'submit',
'formaction' => '/posts/otheraction',
));
echo $this->Form->button('Alernate 2', array(
'type' => 'submit',
'formaction' => '/posts/anotheraction',
));
Reading the docs,我看到‘auth’ Indicates a form validation error, or a controller/action mismatch error.
。然而,这在过去有效 - 似乎事情变得更加严格。如何在不完全关闭安全性的情况下让Cake接受其他操作提交的表单?
答案 0 :(得分:1)
这似乎是不可能的(至少不是没有跳过极大的箍),因为行动无条件地被合并到令牌中。
$hashParts = array(
$this->_lastAction, // <<<<<<<<<<<
serialize($fields),
$unlocked,
Configure::read('Security.salt')
);
$fields = Security::hash(implode('', $hashParts), 'sha1');
<强> https://github.com/cakephp/cakephp/blob/2.7.1/lib/Cake/View/Helper/FormHelper.php#L589 强>
同样禁用此行为可能会削弱安全性,因为发布数据未被用于的操作可能会导致意外行为。
您可以通过单个操作处理此问题,例如,通过为各个提交按钮提供名称和值,并在控制器操作中评估值并执行任何需要执行的操作
echo $this->Form->button('Default', array(
'type' => 'submit',
'name' => 'action',
'value' => 'default'
));
echo $this->Form->button('Alternate 1', array(
'type' => 'submit',
'name' => 'action',
'value' => 'alternate1'
));
echo $this->Form->button('Alernate 2', array(
'type' => 'submit',
'name' => 'action',
'value' => 'alternate2'
));
switch ($this->request->data('action')) {
case 'default':
// ...
break;
case 'alternate1':
// ...
break;
case 'alternate2':
// ...
break;
}
答案 1 :(得分:0)
我使用 jQuery 来改变表单的动作
HTML 按钮:
<button id='saveSubmitter'>Save</button>
javascript:
$('body').on('click', '#saveSubmitter',
function(e){
e.preventDefault()
$('form').attr('action', '<?php echo Router::url( array("action"=>"save")); ?>')
$('form').submit()
}
)