我的目标是为每个用户提供独特的盐,而不仅仅是Configure::read('Security.salt')
为每个用户使用。
我知道 CakePHP 2.x 不再自动散列密码。这允许我对密码执行模型验证,这非常好。但是,我看不到可以覆盖 AuthComponent 的“密码”方法的方法。因此,即使我可以控制密码在保存到数据库之前的哈希方式,但我无法控制在执行实际登录时密码的哈希方式。来自食谱:
在调用
$this->Auth->login()
.
我该怎么做才能$this->Auth->login()
使用自定义的密码散列方法?
谢谢。
更新:我最终选择了 Hannibal Lecter 博士的答案(创建自定义身份验证对象)。这是如何做到的:
旧代码:
$this->Auth->authenticate = array('Form' => array('fields' => array('username' => 'email')));
新代码(将“表单”更改为“自定义”):
$this->Auth->authenticate = array('Custom' => array('fields' => array('username' => 'email')));
创建“app/Controller/Component/Auth/CustomAuthenticate.php”并使其如下所示:
<?php
App::uses('FormAuthenticate', 'Controller/Component/Auth');
class CustomAuthenticate extends FormAuthenticate {
}
从“lib/Cake/Controller/Component/Auth/BaseAuthenticate.php”复制“_findUser”和“_password”方法并将它们粘贴到“CustomAuthenticate”类中。然后对“_findUser”方法进行如下两处修改:
从“$conditions”数组中删除这一行:
$model . '.' . $fields['password'] => $this->_password($password),
更改
if (empty($result) || empty($result[$model])) {
为if (empty($result) || empty($result[$model]) || $result[$model][$fields['password']] != $this->_password($password, $result[$model]['id'])) {
然后对“_password”方法进行如下两处修改:
protected function _password($password) {
通过更改为来创建“$id”参数protected function _password($password, $id) {
return Security::hash($password, null, true);
通过更改为来更新盐值return Security::hash($password, null, Configure::read('Security.salt') . $id);
最后,更新所有出现的AuthComponent::password
以使用Security::hash
与上述相同的逻辑。