Yo recomiendo que la solicitud sea del tipo POST. Ya que se trata de data sensible. lo ideal seria enviar la data a través de una solicitud post https encriptada, pero no he llegado hasta ese punto por ahora.
public function login(){
}
public function logout(){
$this->Auth->logout();
$this->redirect('/');
}
public function in(){
if($this->request->is('post')){
$request = $this->request->data;
}else{
$request = $this->request->query;
}
$options = array(
'conditions' => array(
'User.email' => $request['email'],
'User.password' => $this->Auth->password($request['password'])
)
);
$user = $this->User->find('first',$options);
if($user == true){
if($this->Auth->login($user)){
$return['login'] = true;
}else{
$return['login'] = false;
}
}else{
$return['login'] = false;
}
$this->set('return',$return);
$this->render('ajax_view','ajax');
}
por convención yo uso las url en ingles para solicitudes ajax y las que quedan en español son las que el usuario ve.
Router::connect('/salir', array('controller' => 'users', 'action' => 'logout')); // Accion Get - Para salir de la aplicación
Router::connect('/entrar', array('controller' => 'users', 'action' => 'login')); // Accion Get - Interfaz de entrada a la aplicación o registro de un nuevo usuario.
Router::connect('/login', array('controller' => 'users', 'action' => 'in')); // Accion Ajax - Para entrar a la aplicación.
Router::connect('/new_user', array('controller' => 'users', 'action' => 'add')); // Acción Ajax - Para registrar un nuevo usurio.
Router::connect('/check_email', array('controller' => 'users', 'action' => 'check_email')); // Acción Ajax - Para determinar si el correo ya se ha registrado.
Router::connect('/recover_account', array('controller' => 'users', 'action' => 'recover_account')); // Acción Ajax - Para recuperar una cuenta.
Como notaras tengo una acción login que no tiene nada de lógica por que su función es mostrar la vista que el usuario ve al intentar loguearse y es solicitada por la url /entrar cuando el usuario intenta loguearse acede a a la accion /in en una solicitud ajax. Esta acción recibe los datos por via post, luego a través de una consulta determino si existe o no tal usuario en la base de datos. si existe, creo el usuario al pasar los datos a $this->Auth->login($user)
********************************************************************************************************
eso debería responder la interrogante
"Pero siempre me regresa el primer usuario de la BD aún estando mal los datos enviados.
¿Cómo deberia setear los datos?"
en tu código:
if ($this->Auth->login()) { // esta preguntando si esta logueado. lo cual no tiene sentido por que la idea es que aceda, por lo tanto siempre se va ejecutar la segunda sentencia que es regresar la data de la solicitud.
$data = $this->Auth->user(); //
} else {
$data = $this->request;
}
**********************************************************************************************************
Desde el controlador puedes acceder a los datos con este código:
$this->Auth->User()
en AppController tengo este código para disponer en las vista tipo GET la data del usuario
public function beforeRender(){
// Destrulle la sección al abrir x links en otra pestaña si se coloca en la funcion beforeFilter.
if($this->Auth->User()){
$this->set('userLogged',$this->Auth->User());
}
}
todos los controladores deberían tener acceso restringido si la configuración de Auth es la correcta.
public $components = array(
'Auth' => array(
'authenticate' => array(
'Form' => array(
'fields' => array('username' => 'email')
)
),
'loginAction'=>'entrar',
'loginRedirect' => 'cuenta',
'logoutRedirect'=> '',
'ajaxLogin'=>'expired_session'
),
'Cookie',
'Session'
);
//expired_session es un elemento que muestro cuando se vence la sección
<?php
$return['expired_session'] = true;
echo json_encode($return);
?>
Hasta el momento uso jquery y jquery-validation para mis solicitudes y validación ajax. Con AngularJs he realizado varios experimentos a la ves que voy documentándolos. Ahora voy a retomarlo nuevamente ya que voy hacer unas pruebas con spring.
saludos.