Just to keep track of this in CakePHP 2.4.1, I created an interface for an outdated database with user passwords stored as md5 (accountnumber: statictext: password), and for users to be able to log in, we needed to use this hashing system.
Decision:
Create the application file / Controller / Component / Out / CustomAuthenticate.php with:
<?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); } }
"Extends FormAuthenticate" means that this file accepts the _findUser function, but has canceled FormAuthenticate for all other functions, as usual. This is then activated by editing AppController.php and adding it to the AppController class like this:
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'), ) ), ) );
In particular, pay attention to the use of the character of the associative array "Custom".
Finally, it is necessary to create a hash password when creating a new user, so I added to the model file (in my case 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; }