Intereting Posts
symfony, как получить выбранные данные из выбранного PHP – Амперсанд перед переменной в цикле foreach Является ли их способ разместить контент в IFRAME без использования src Как я могу отправить данные div в MySQL Как я могу ограничить ограничение open_basedir PHP? Поля MySQL datetime и летнее время – как я могу ссылаться на «дополнительный» час? Аутентификация самозаверяющего сертификата для подключения LDAPS FB.Event.Subscribe не работает для некоторых пользователей Как отправить переменную из php в приложение для Android? Разметка страницы, чтобы показать максимальное значение и ограничить остальные Какова сделка с ведущим подчеркиванием в методах класса PHP? Как автоматически перенаправить пользователя в Symfony после таймаута сеанса? Один файл cookie со многими значениями или много файлов cookie с одним значением? Получить URL-адрес изображения из параметра twit api entity php перемещение пакета из каталога поставщика в каталог src

Как заменить алгоритм хэширования пароля cakephp?

У меня есть существующая база данных, на которой я пытаюсь добавить приложение для торта. Старое приложение использовало crypt () в Perl для хеширования паролей. Мне нужно сделать то же самое в приложении PHP.

Где подходящее место для внесения изменений в стандартное приложение cakephp? И как это изменится?

Я получил его работу …

вот мой AppController:

class AppController extends Controller { var $components = array('Auth'); function beforeFilter() { // this is part of cake that serves up static pages, it should be authorized by default $this->Auth->allow('display'); // tell cake to look on the user model itself for the password hashing function $this->Auth->authenticate = ClassRegistry::init('User'); // tell cake where our credentials are on the User entity $this->Auth->fields = array( 'username' => 'user', 'password' => 'pass', ); // this is where we want to go after a login... we'll want to make this dynamic at some point $this->Auth->loginRedirect = array('controller'=>'users', 'action'=>'index'); } } 

Тогда вот пользователь:

 <?php class User extends AppModel { var $name = 'User'; // this is used by the auth component to turn the password into its hash before comparing with the DB function hashPasswords($data) { $data['User']['pass'] = crypt($data['User']['pass'], substr($data['User']['user'], 0, 2)); return $data; } } ?> 

Я думаю, все остальное нормально.

Вот хороший ресурс: http://teknoid.wordpress.com/2008/10/08/demystifying-auth-features-in-cakephp-12/

На самом деле выше описанный метод danb не работал для меня в CakePHP 2.x Вместо этого я закончил создание настраиваемого компонента auth для обхода стандартного алгоритма хэширования:

/app/Controller/Component/Auth/CustomFormAuthenticate.php

 <?php App::uses('FormAuthenticate', 'Controller/Component/Auth'); class CustomFormAuthenticate extends FormAuthenticate { protected function _password($password) { return self::hash($password); } public static function hash($password) { // Manipulate $password, hash, custom hash, whatever return $password; } } 

… и затем используйте это в моем контроллере …

 public $components = array( 'Session', 'Auth' => array( 'authenticate' => array( 'CustomForm' => array( 'userModel' => 'Admin' ) ) ) ); 

Этот последний блок также может быть помещен внутри метода beforeFilter для AppController . В моем случае я просто решил включить его в один контроллер, где я собирался использовать пользовательскую аутентификацию с другой моделью пользователя.

Просто для того, чтобы следить за этим в CakePHP 2.4.1, я создавал интерфейс для устаревшей базы данных с имеющимися паролями пользователей, хранящимися как md5 (accountnumber: statictext: password), и чтобы пользователи могли входить в систему, нам нужно было использовать это хеширование системы.

Решение было:

Создайте приложение для файлов / Controller / Component / 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); } } с <?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); } } с <?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; }