CakePHP 2: переопределить метод «пароля» AuthComponent
Моя цель - иметь уникальную соль для каждого пользователя, а не просто использоватьConfigure::read('Security.salt')
для каждого пользователя.
Я знаю, что CakePHP 2.x больше не хэширует пароли автоматически. Это позволяет мне выполнять проверку модели по паролям, что очень приятно. Тем не менее, я не вижу способа, которым я мог бы переопределить «пароль» AuthComponent's. метод. Поэтому, хотя я могу контролировать, как хешируются пароли до их сохранения в базе данных, я не могу контролировать, как хешируются пароли при выполнении реального входа в систему. Из кулинарной книги:
You don’t need to hash passwords before calling
$this->Auth->login()
.
Что я могу сделать, чтобы сделать$this->Auth->login()
использовать собственный метод хеширования пароля?
Благодарю.
UPDATE: Я закончил с ответом доктора Ганнибала Лектера (создание пользовательского объекта аутентификации). Вот как это сделать:
Старый код:
$this->Auth->authenticate = array('Form' => array('fields' => array('username' => 'email')));
Новый код (смените «Форма» на «Пользовательский»):
$this->Auth->authenticate = array('Custom' => array('fields' => array('username' => 'email')));
Создать & quot; app / Controller / Component / Auth / CustomAuthenticate.php & quot; и сделать так, чтобы это выглядело так:
<?php
App::uses('FormAuthenticate', 'Controller/Component/Auth');
class CustomAuthenticate extends FormAuthenticate {
}
Скопируйте & quot; _findUser & quot; и & quot; _password & quot; методы из & quot; lib / Cake / Controller / Component / Auth / BaseAuthenticate.php & quot; и вставьте их в & quot; CustomAuthenticate & quot; учебный класс. Затем внесите следующие две модификации в & quot; _findUser & quot; метод:
Remove this line from the "$conditions" array: $model . '.' . $fields['password'] => $this->_password($password),
Change if (empty($result) || empty($result[$model])) {
to if (empty($result) || empty($result[$model]) || $result[$model][$fields['password']] != $this->_password($password, $result[$model]['id'])) {
Затем внесите следующие две модификации в & quot; _password & quot; метод:
Create the "$id" parameter by changing protected function _password($password) {
to protected function _password($password, $id) {
Update the salt value by changing return Security::hash($password, null, true);
to return Security::hash($password, null, Configure::read('Security.salt') . $id);
Наконец, обновите все вхожденияAuthComponent::password
использоватьSecurity::hash
с той же логикой, что и выше.