CakePHP安全组件blackholing登录(未生成数据[_Token] [key]字段)
当我尝试登录时,请求被安全组件分开.我怎样才能让它正常工作?
我有一个简单的登录表单 <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','placeholder' => __('Password'))); echo $this->Form->submit(__('Login')); echo $this->Form->end(); ?> </div> </div> 控制器动作如下: 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'); } } } 安全组件包含在AppController中 public $components = array('Security',... ); 在error.log中,我得到: 2013-03-29 13:40:58 Error: [BadRequestException] The request has been black-holed Request URL: /users/login Stack Trace: #0 C:wampwwwcdxlibCakeControllerComponentSecurityComponent.php(234): SecurityComponent->blackHole(Object(UsersController),'auth') #1 [internal function]: SecurityComponent->startup(Object(UsersController)) #2 C:wampwwwcdxlibCakeUtilityObjectCollection.php(131): call_user_func_array(Array,Array) #3 [internal function]: ObjectCollection->trigger(Object(CakeEvent)) #4 C:wampwwwcdxlibCakeEventCakeEventManager.php(247): call_user_func(Array,Object(CakeEvent)) #5 C:wampwwwcdxlibCakeControllerController.php(670): CakeEventManager->dispatch(Object(CakeEvent)) #6 C:wampwwwcdxlibCakeRoutingDispatcher.php(183): Controller->startupProcess() #7 C:wampwwwcdxlibCakeRoutingDispatcher.php(161): Dispatcher->_invoke(Object(UsersController),Object(CakeRequest),Object(CakeResponse)) #8 C:wampwwwcdxappwebrootindex.php(92): Dispatcher->dispatch(Object(CakeRequest),Object(CakeResponse)) #9 {main} 我怎样才能找到让我的请求进入黑洞的原因? 当我尝试使用自定义黑洞处理程序时,错误的类型是auth.但这就是我能获得的所有信息 我的CakePHP版本是2.3.1 编辑: EDIT2:我在表单中没有任何数据[_Token] [key]字段 编辑3污染:
您以什么顺序添加组件?安全组件应该放在其startup()中处理表单数据的其他组件之前:
“如果您正在使用安全组件的表单保护功能以及在其startup()回调中处理表单数据的其他组件,请务必将安全组件放在$components数组中的那些组件之前.” Security 因为AuthComponent确实处理了 public $components = array( 'Security','Session','Auth' => array( // auth component settings ) ); 更新 OP公布的“最终”答案明确指出,这个问题无法得到解答.事实证明,团队中的某个人对HtmlHelper进行了修改,导致它不输出“隐藏”块,因此不输出CSRF令牌. 在正常情况下,您不应该自己修改CakePHP Framework文件. CakePHP提供了覆盖其功能(包括Helpers)的方法,而无需修改“核心”CakePHP文件. 为什么修改CakePHP文件很糟糕 例如,考虑一辆汽车.如果机修工不喜欢设计并决定“更换”制动踏板和油门踏板怎么办? 当然,如果你知道这个修改,汽车仍然可以驾驶.然而,没有这些重要信息,任何其他司机肯定会崩溃(并想知道刚刚发生了什么!?) 如果框架的默认行为不符合您的需求,请扩展这些类.不要自己修改框架文件(除非确实没有其他选项).如果对框架的修改是绝对必要的,请务必与团队讨论并编写有关已经进行的更改的文档. 请记住,如果不对更新版本应用相同的修改,将无法再将框架更新到更新的版本.同样,如果没有记录更改,有人可能会更新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>'; } } 然后,以常规方式使用你的助手: echo $this->AwesomeHtml->tableHeaders(array('Date','Title','Active')); 2.’Drop-in’替换 – 使用别名(CakePHP> 2.3) 由于CakePHP 2.3可以使用Helper的别名.此功能可用于(例如)应用程序中存在两个具有相同名称的帮助程序(例如Plugin.HtmlHelper)的情况. 此外,这允许您使用自己的Helper覆盖CakePHP Helper.请参阅此处的文档:Using and Configuring Helpers 请注意,这将覆盖应用程序中的Helper! public $helpers = array( 'Html' => array( 'className' => 'AwesomeHtml' ) ); 现在,$this-> Html实际上会引用您视图中的AwesomeHtmlHelper: echo $this->eHtml->tableHeaders(array('Date','Active')); 将输出您的“增强型”表格标题 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |