Elw*_*his 7 security cakephp cakephp-2.3
当我尝试登录时,请求被Security组件分开.我怎样才能让它正常工作?
我有一个简单的登录表单
<div class="container container-login">
<h2><?php echo __('Login'); ?></h2>
<div class="wrap-form-signin">
<?php
echo $this->Form->create('User', array('action' => 'login', 'class' => 'form-signin'));
echo $this->Form->input('username', array('label' => '', 'placeholder' => __('Email')));
echo $this->Form->input('password', array('label' => '', 'placeholder' => __('Password')));
echo $this->Form->submit(__('Login'));
echo $this->Form->end();
?>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
控制器动作如下:
public function login() {
if ($this->request->is('post')) {
if ($this->Auth->login()) {
return $this->redirect($this->Auth->redirectUrl());
} else {
$this->Session->setFlash(__('Username or password is incorrect'), 'default', array(), 'auth');
}
}
}
Run Code Online (Sandbox Code Playgroud)
该Security组件包含在内AppController
public $components = array('Security', ... );
Run Code Online (Sandbox Code Playgroud)
在error.log中,我得到:
2013-03-29 13:40:58 Error: [BadRequestException] The request has been black-holed
Request URL: /users/login
Stack Trace:
#0 C:\wamp\www\cdx\lib\Cake\Controller\Component\SecurityComponent.php(234): SecurityComponent->blackHole(Object(UsersController), 'auth')
#1 [internal function]: SecurityComponent->startup(Object(UsersController))
#2 C:\wamp\www\cdx\lib\Cake\Utility\ObjectCollection.php(131): call_user_func_array(Array, Array)
#3 [internal function]: ObjectCollection->trigger(Object(CakeEvent))
#4 C:\wamp\www\cdx\lib\Cake\Event\CakeEventManager.php(247): call_user_func(Array, Object(CakeEvent))
#5 C:\wamp\www\cdx\lib\Cake\Controller\Controller.php(670): CakeEventManager->dispatch(Object(CakeEvent))
#6 C:\wamp\www\cdx\lib\Cake\Routing\Dispatcher.php(183): Controller->startupProcess()
#7 C:\wamp\www\cdx\lib\Cake\Routing\Dispatcher.php(161): Dispatcher->_invoke(Object(UsersController), Object(CakeRequest), Object(CakeResponse))
#8 C:\wamp\www\cdx\app\webroot\index.php(92): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse))
#9 {main}
Run Code Online (Sandbox Code Playgroud)
我怎样才能找到让我的请求进入黑洞的原因?
当我尝试使用自定义黑洞处理程序时,错误的类型是auth.但这就是我能获得的所有信息
我的CakePHP版本是2.3.1
编辑:登录适用于没有Security组件.将其添加到后AppController,登录将停止工作.
编辑2:data[_Token][key]表格中没有任何字段
EDIT3 THE SOLLUTION:我团队中的某个人已经覆盖了HTMLHelper类,它错过了_tags数组中的"hiddenblock",导致缺少_Token字段.有关详细信息,请参阅我的和thaJeztah的答案以及他们的评论
您以什么顺序添加组件?安全组件应该放在处理表单数据的其他组件之前startup():
"如果您正在使用安全组件的表单保护功能和在其startup()回调中处理表单数据的其他组件,请务必将安全组件放在$ components数组中的那些组件之前."
因为AuthComponent 确实处理了里面的表单数据startup(),我认为这适用,所以请确保SecurityComponent 位于$ components数组中的AuthComponent 之前 ;
public $components = array(
'Security',
'Session',
'Auth' => array(
// auth component settings
)
);
Run Code Online (Sandbox Code Playgroud)
OP公布的"最终"答案明确指出,这个问题无法得到解答.事实证明,团队中的某个人对HtmlHelper进行了修改,导致它不输出"隐藏"块,因此不输出CSRF令牌.
在正常情况下,你应该永远给CakePHP的框架文件本身进行修改.CakePHP提供了覆盖其功能(包括Helpers)的方法,而无需修改"核心"CakePHP文件.
例如,考虑一辆汽车.如果机修工不喜欢设计并决定"更换"制动踏板和油门踏板怎么办?
当然,如果你知道这个修改,汽车仍然可以驾驶.然而,没有这些重要信息,任何其他司机肯定会崩溃(并想知道刚刚发生了什么!?)
如果框架的默认行为不符合您的需求,请扩展这些类.不要不修改框架文件本身(除非真的是没有其他选择).如果对框架的修改是绝对必要的,请务必与团队讨论并编写有关所做更改的文档.
请记住,如果不对更新版本应用相同的修改,将无法再将框架更新到更新的版本.同样,如果没有记录更改,有人可能会更新CakePHP并破坏您的修改.
此外,如果您覆盖或修改CakePHP,请确保覆盖与CakePHP的默认行为兼容,并且CakePHP的单元测试仍然正确运行(或为修改创建新的单元测试)
如果您需要自定义CakePHP Helpers(或其他组件),可以在不修改CakePHP文件的情况下执行各种操作;
1.扩展助手
class AwesomeHtmlHelper extends HtmlHelper {
/**
* enhanced tableHeaders method, outputs tableHeaders in a 'thead' tag
*
* {@inheritdoc}
*/
public function tableHeaders(array $names, array $trOptions = null, array $thOptions = null)
{
$output = parent::tableHeaders($names, $trOptions, $thOptions);
return '<thead>' . $output . '</thead>';
}
}
Run Code Online (Sandbox Code Playgroud)
然后,以常规方式使用你的助手:
echo $this->AwesomeHtml->tableHeaders(array('Date', 'Title', 'Active'));
Run Code Online (Sandbox Code Playgroud)
2.'Drop-in'替换 - 使用别名(CakePHP> 2.3)
由于CakePHP 2.3可以使用Helper的别名.此功能可用于(例如)应用程序中存在两个具有相同名称的帮助程序(例如Plugin.HtmlHelper).
此外,这允许您使用自己的Helper覆盖CakePHP Helper.请参阅此处的文档:使用和配置助手
请注意,这将覆盖助手无处不在您的申请!
public $helpers = array(
'Html' => array(
'className' => 'AwesomeHtml'
)
);
Run Code Online (Sandbox Code Playgroud)
现在,$this->Html实际上会参考AwesomeHtmlHelper你的观点:
echo $this->eHtml->tableHeaders(array('Date', 'Title', 'Active'));
Run Code Online (Sandbox Code Playgroud)
将输出"增强型"表格标题