Para seguir esto en CakePHP 2.4.1, estaba construyendo un front-end para una base de datos heredada que tenía contraseñas de usuario existentes almacenadas como md5 (número de cuenta: statictext: contraseña) y para permitir a los usuarios iniciar sesión necesitábamos para usar ese sistema de hash también.
La solución fue:
Cree un archivo app/Controlador/Componente/auth/CustomAuthenticate.php con:
<?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);
}
}
El "extiende FormAuthenticate" significa que este archivo se hace cargo de la función, pero _findUser difiere a FormAuthenticate para todas las demás funciones de forma normal. Esto entonces se activa mediante la edición de AppController.php y añadiendo a la clase AppController algo como esto:
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'),
)
),
)
);
En particular interés el uso de la clave de la matriz asociativa 'personalizado'.
Por último es necesario hash de la contraseña al crear un nuevo usuario, por lo que el archivo de modelo (en mi caso account.php) añadí:
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;
}
El nombre del archivo es necesario que haya CustomFormAuthenticate.php - no CustomFormAuthentication .php –
Gracias, buena captura – jesal
@jesal Sé que este es un hilo de 5 meses, pero ¿sabes cómo estructurar la clase CustomFormAuthenticate si necesito usar cryp con el correo electrónico como salt.Obviamente, el correo electrónico no está accesible en este momento? ¡Por favor ayuda! – rizalp1