我实际上已经想到了这一点,但在与其他开发人员进行头脑风暴之前我无法找到任何相关内容 - 通过核心代码来查明发生了什么。
问题很简单 - 从CakePHP v1.3升级到v2.5.9后,登录(身份验证)不起作用。但没有错误信息告诉你它为什么不起作用。
正如2.0 Migration Guide中所述:
AuthComponent完全被重新考虑了2.0,这是为了帮助减少开发人员的困惑和挫败感。此外,AuthComponent变得更加灵活和可扩展。您可以在Authentication指南中找到更多信息。
上面提到的身份验证指南很好地解释了如何让它为新安装工作,但没有关于迁移需要做什么。
进一步的问题是没有错误告诉你发生了什么。
我从Identifying users上的身份验证指南部分复制了UsersController.php -> login
方法的代码:
public function login() {
if ($this->request->is('post')) {
// Important: Use login() without arguments! See warning below.
if ($this->Auth->login()) {
return $this->redirect($this->Auth->redirectUrl());
// Prior to 2.3 use
// `return $this->redirect($this->Auth->redirect());`
}
$this->Session->setFlash(
__('Username or password is incorrect'),
'default',
array(),
'auth'
);
}
}
在我的AppController.php
中,我有以下内容:
public $components = array(
'Session', 'P28n', 'Store', 'SiteStore', 'UserAccessLevel', 'Auth'
);
然后在AppController.php -> beforeFilter
:
$this->Auth->authorize = array('Controller');
$this->Auth->loginError = __('Login failed, invalid username or password. Please try again.');
$this->Auth->authError = __('Please log-in.');
$this->Auth->allow('login', 'logout');
我知道唯一确定的是$this->Auth->login()
返回false。但问题可能是任何问题。
答案 0 :(得分:0)
问题是密码哈希。一旦你知道答案就很容易。
我已经添加了简单密码哈希组件suggested in the Authentication guide:
public $components = array(
'Auth' => array(
'authenticate' => array(
'Form' => array(
'passwordHasher' => array(
'className' => 'Simple',
'hashType' => 'sha256'
)
)
)
)
);
但是这仍然失败了,但我无法确认密码哈希绝对是原因。它将代码跟踪到BaseAuthenticate::_findUser
,但肯定没有通过密码来确认它。
此时我接着说,可以使CakePHP中的密码散列与Simple passwordHasher相匹配。
CakePHP 1.3中的密码使用sha1保存,切换'hashType' => 'sha1'
修复了问题:
public $components = array(
'Auth' => array(
'authenticate' => array(
'Form' => array(
'passwordHasher' => array(
'className' => 'Simple',
'hashType' => 'sha1'
)
)
)
)
);