[英]Why is the CakePHP authentication component not hashing my password?
我正在使用带有 Auth 和 ACL 组件的CakePHP 1.2。
在我的用户注册操作中,密码未经过哈希处理。 具体来说,这个表达式:
if ($this->data['User']['password'] !=
$this->Auth->password($this->data['User']['confirm_password']))
即使我为password
和confirm_password
提交相同的值,这也被评估为真。 我知道密码是未散列的,因为当我删除对Auth->password
的调用时,表达式的计算结果为 false。
我希望 Auth 模块自动 hash 密码。 我究竟做错了什么?
这是我的看法:
<?php
echo $form->create('User', array('action' => 'register'));
echo $form->input('email',
array('after' => $form->error(
'email_unique', 'This email is already registered.')));
echo $form->input('password');
echo $form->input('confirm_password', array('type' => 'password'));
echo $form->end('Register');
?>
这是用户 controller 的注册操作:
function register(){
if ($this->data) {
if ($this->data['User']['password'] !=
$this->Auth->password($this->data['User']['confirm_password'])) {
$this->Session->setFlash(__('Password and Confirm Password must match.', true));
$this->data['User']['password'] = '';
$this->data['User']['confirm_password'] = '';
}
else{
$this->User->create();
if ($this->User->save($this->data)){
$this->redirect(array('action' => 'index'), null, true);
}
else {
$this->data['User']['password'] = '';
$this->data['User']['confirm_password'] = '';
$this->Session->setFlash(__('Some problem saving your information.', true));
}
}
}
}
这是我的appController
,其中包含Auth
和Acl
模块:
class AppController extends Controller {
var $components = array('Acl', 'Auth');
function beforeFilter(){
if (isset($this->Auth)) {
$this->Auth->allow('display');
$this->Auth->fields =
array(
'username' => 'email',
'password' => 'password');
$this->Auth->authorize = 'actions';
}
}
}
我究竟做错了什么?
CakePHP 不会 hash 密码,除非用户名包含提交的值。 我用 email 替换用户名字段。 但是,我通过设置 Auth->fields 数组重新映射了这些字段。 但是,我是在 appController 而不是 userController 中这样做的。 所以移动这条线:
$this->Auth->fields = array('username' => 'email', 'password' => 'password');
从 appController 到 userController 解决了它。
现在问题变成了“为什么我不能重置 appController 中的 Auth-> 字段?”
您可能正在用您的UsersController::beforeFilter()
覆盖AppController::beforeFilter()
() 。
要“修复”它,只需将parent::beforeFilter()
放在 function 的开头即可。
在保存到数据库之前,您应该使用 hash 密码。 将此 function 放入您的用户 model:
function beforeSave() {
if(isset($this->data[$this->alias]['password']))
$this->data[$this->alias]['password'] = Security::hash($this->data[$this->alias]['password'], null, true);
return true;
}
并且不要忘记将这个放在beforeFilter()
中给您的用户 controller:
if(in_array($this->action, array('register'))) {
$this->Auth->fields = array('username' => 'email', 'password' => 'wrongfield');
}
这意味着在注册过程中不会对密码进行哈希处理(以防注册表单验证失败)。
我想你在找
hashPasswords ($data)
看看这些页面。 他们应该为您指明正确的方向。 您也可以尝试在核心配置文件中更改调试级别。 将其从 0(生产)更改为 3 可以让您看到 sql output。 可能会有所帮助。
对不起,我无能为力,只能为您指明正确的方向。 我是 cakephp 的新手。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.