CakePHP Versión 1.2.5Componente Auth de CakePHP con 2 tablas
Deseo que un solo usuario tenga varias direcciones de correo electrónico.
Me gustaría que un solo usuario tenga una sola contraseña.
Me gustaría que los usuarios inicien sesión usando cualquiera de sus múltiples direcciones de correo electrónico y su contraseña única.
He creado una tabla de usuarios con un id y un campo de contraseña.
He creado una tabla user_email_addresses con un campo id. Un campo user_id y un campo email_address.
Pregunta:
¿Cómo modificar el componente de autenticación mínimamente a buscar el "nombre de usuario" en este caso, "email_address", en la tabla user_email_addresses y la "contraseña" en la tabla de usuarios?
Parece que modificando el método de identificación en el componente de autenticación podría hacerlo. Pero creo que modificar directamente el componente de autenticación es una mala idea: ¿alguna idea sobre cómo extender y aún posiblemente modificar el método de identificación? http://cakebaker.42dh.com/2009/09/08/extending-cakephps-core-components/ o posiblemente nominar un objeto autenticado diferente?
Línea de salida 774:
function identify($user = null, $conditions = null) {
if ($conditions === false) {
$conditions = null;
} elseif (is_array($conditions)) {
$conditions = array_merge((array)$this->userScope, $conditions);
} else {
$conditions = $this->userScope;
}
if (empty($user)) {
$user = $this->user();
if (empty($user)) {
return null;
}
} elseif (is_object($user) && is_a($user, 'Model')) {
if (!$user->exists()) {
return null;
}
$user = $user->read();
$user = $user[$this->userModel];
} elseif (is_array($user) && isset($user[$this->userModel])) {
$user = $user[$this->userModel];
}
if (is_array($user) && (isset($user[$this->fields['username']]) || isset($user[$this->userModel . '.' . $this->fields['username']]))) {
if (isset($user[$this->fields['username']]) && !empty($user[$this->fields['username']]) && !empty($user[$this->fields['password']])) {
if (trim($user[$this->fields['username']]) == '=' || trim($user[$this->fields['password']]) == '=') {
return false;
}
$find = array(
$this->userModel.'.'.$this->fields['username'] => $user[$this->fields['username']],
$this->userModel.'.'.$this->fields['password'] => $user[$this->fields['password']]
);
} elseif (isset($user[$this->userModel . '.' . $this->fields['username']]) && !empty($user[$this->userModel . '.' . $this->fields['username']])) {
if (trim($user[$this->userModel . '.' . $this->fields['username']]) == '=' || trim($user[$this->userModel . '.' . $this->fields['password']]) == '=') {
return false;
}
$find = array(
$this->userModel.'.'.$this->fields['username'] => $user[$this->userModel . '.' . $this->fields['username']],
$this->userModel.'.'.$this->fields['password'] => $user[$this->userModel . '.' . $this->fields['password']]
);
} else {
return false;
}
$model =& $this->getModel();
$data = $model->find(array_merge($find, $conditions), null, null, 0);
if (empty($data) || empty($data[$this->userModel])) {
return null;
}
} elseif (!empty($user) && is_string($user)) {
$model =& $this->getModel();
$data = $model->find(array_merge(array($model->escapeField() => $user), $conditions));
if (empty($data) || empty($data[$this->userModel])) {
return null;
}
}
if (!empty($data)) {
if (!empty($data[$this->userModel][$this->fields['password']])) {
unset($data[$this->userModel][$this->fields['password']]);
}
return $data[$this->userModel];
}
return null;
}
Gracias deizel - ¡exactamente lo que estaba buscando! – BWelfel