Моя цель - иметь уникальную соль для каждого пользователя, а не просто использовать Configure::read('Security.salt')
для каждого пользователя.
Я знаю, что CakePHP 2.x больше не хэширует пароли автоматически. Это позволяет мне выполнять проверку модели на паролях, что очень приятно. Однако я не вижу способа, которым я могу переопределить метод "пароль" AuthComponent. Поэтому, хотя я могу контролировать, как пароли хэшируются до их сохранения в базе данных, я не могу контролировать, как пароли хэшируются при выполнении фактического входа. Из поваренной книги:
Вам не нужны хэш-пароли перед вызовом
$this->Auth->login()
.
Что я могу сделать, чтобы $this->Auth->login()
использовал специальный метод хэширования паролей?
Спасибо.
ОБНОВЛЕНИЕ: Я закончил с ответом доктора Ханнибала Лектера (создание пользовательского объекта аутентификации). Вот как это сделать:
Старый код:
$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 {
}
Скопируйте методы "_findUser" и "_password" из "lib/Cake/Controller/Component/Auth/BaseAuthenticate.php" и вставьте их в класс "CustomAuthenticate". Затем выполните следующие две модификации метода "_index.ser":
-
Удалите эту строку из массива "$ 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":
-
Создайте параметр "$ id", изменив
protected function _password($password) {
на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
с той же логикой, что и выше.