Просто для того, чтобы следить за этим в CakePHP 2.4.1, я создавал интерфейс для устаревшей базы данных с имеющимися паролями пользователей, хранящимися как md5 (accountnumber: statictext: password), и чтобы пользователи могли войти в систему, мы нуждались для использования этой системы хэширования.
Решение было:
Создайте файл приложения/контроллер/компонент/Auth/CustomAuthenticate.php с:
<?php
App::uses('FormAuthenticate', 'Controller/Component/Auth');
class CustomAuthenticate extends FormAuthenticate {
protected function _findUser($username, $password = null) {
$userModel = $this->settings['userModel'];
list(, $model) = pluginSplit($userModel);
$fields = $this->settings['fields'];
if (is_array($username)) {
$conditions = $username;
} else {
$conditions = array(
$model . '.' . $fields['username'] => $username
);
}
if (!empty($this->settings['scope'])) {
$conditions = array_merge($conditions, $this->settings['scope']);
}
$result = ClassRegistry::init($userModel)->find('first', array(
'conditions' => $conditions,
'recursive' => $this->settings['recursive'],
'contain' => $this->settings['contain'],
));
if (empty($result[$model])) {
return false;
}
$user = $result[$model];
if ($password) {
if (!(md5($username.":statictext:".$password) === $user[$fields['password']])) {
return false;
}
unset($user[$fields['password']]);
}
unset($result[$model]);
return array_merge($user, $result);
}
}
"расширяет FormAuthenticate" означает, что этот файл берет на себя функцию _findUser но отменит FormAuthenticate для всех других функций, как обычно. Это затем активируется путем редактирования AppController.php и добавления к классу AppController что-то вроде этого:
public $components = array(
'Session',
'Auth' => array(
'loginAction' => array('controller' => 'accounts', 'action' => 'login'),
'loginRedirect' => array('controller' => 'accounts', 'action' => 'index'),
'logoutRedirect' => array('controller' => 'pages', 'action' => 'display', 'home'),
'authenticate' => array (
'Custom' => array(
'userModel' => 'Account',
'fields' => array('username' => 'number'),
)
),
)
);
В частности, обратите внимание на использование ассоциативного ключа массива «Пользовательский».
Наконец, необходимо хэш пароля при создании нового пользователя, так модель файла (в моем случае Account.php) Я добавил:
public function beforeSave($options = array()) {
if (isset($this->data[$this->alias]['password'])) {
$this->data[$this->alias]['password'] = md5($this->data[$this->alias]['number'].":statictext:".$this->data[$this->alias]['password']);
}
return true;
}
Имя файла должно быть CustomFormAuthenticate.php - не CustomFormAuthentication .php –
Спасибо, хорошо поймать – jesal
@jesal Я знаю, что это 5-месячный поток, но знаете ли вы, как структурировать класс CustomFormAuthenticate, если мне нужно использовать cryp с электронной почтой как соль.Очевидно, что электронная почта недоступна на данный момент? Пожалуйста помоги! – rizalp1