Autenticación en CakePHP 2.4.4 sin AuthComponent

Publicado: enero 26, PM en CakePHP
Etiquetas:, , , , ,

Desde hace algún tiempo he comprobado que hay muchos desarrolladores que al tratar de implementar un sistema de autenticación en CakePHP con AuthComponent tienen problemas y no funciona como debería. Sea por motivos de versión del framework o, simplemente, porque no está bien implementado el código, la cuestión es que la aplicación no funciona.
Vamos entonces a ver a continuación cómo programar un sistema de autenticación sin la necesidad del AuthComponent.
Partimos de que tenemos una base de datos conectada correctamente a través de la configuración de nuestro archivo database.php y, además, suponemos que tenemos ya una aplicación en CakePHP que debemos proteger de usuarios no autenticados.
Con lo primero que debemos contar es con una tabla en nuestra base de datos que yo he llamado users. Esta tabla cuenta a su vez con tres campos: id, username y password. El campo id será nuestra clave primaria autoincremental y los otros dos campos de tipo varchar.
Una vez hecho esto, vamos con el código. Abrimos nuestro archivo AppController que se encuentra en la ruta CarpetaAplicacion/app/Controller donde CarpetaAplicacion es el nombre de la carpeta donde guardas tu proyecto. Escribimos el siguiente código:

<?php

App::uses('Controller','Controller');

class AppController extends Controller {

public$components=array('Session');

    // Comprobar si el usuario está logueado
    function authenticate()
    {
        // Comprobamos si la variable de sesión existe. Si es así quiere decir que el usuario se ha logueado
       //correctamente y se le redirecciona a la aplicación.
      //Si no existe se le devuelve al login.
        if(!$this->Session->check('User'))
        {
            $this->redirect(array('controller'=>'users','action'=>'autenticar'));
            exit();
        }

    }
 
    //Autenticación obligatoria si se quiere entrar a cualquier parte de la aplicación
    function afterFilter()
    {
        if($this->action!='autenticar')
        {
            $this->authenticate();
        }
    }
}

La función afterFilter va a permitirnos controlar cuándo un usuario intenta entrar en una zona donde se ejecuta una acción distinta a ‘autenticar’. Inmediatamente llama a la función authenticate que nos va a permitir saber si se ha creado ya una sesión de usuario. Si es así significará que el usuario esta autenticado, con lo que automáticamente será redireccionado al index de la aplicación. Si no es así se le redireccionará de nuevo a la acción autenticar del controlador users (lo veremos a continuación) que, por supuesto, contará con una vista que contendrá el formulario de login. Sigamos.
Ahora vamos a crear, dentro de la carpeta de nuestros modelos, un archivo con el nombre User.php. La ruta será CarpetaAplicacion/app/Model/User.php. Escribimos lo siguiente:

<?php
App::uses('AppModel','Model');
/**
 * User Model
 *
 */
class User extends AppModel {

   var$name='User';

/**
 * Display field
 *
 * @var string
 */

   public$displayField='username';

   var$validate=array(
       'username'=>array(
                    'rule'=>array('minLength',1),
                    'required'=>true,
                    'allowEmpty'=>false,
                    'message'=>'Por favor, introduce un nombre'
                    ),
       'password'=>array(
                    'rule'=>array('minLength',1),
                    'required'=>true,
                    'allowEmpty'=>false,
                    'message'=>'Por favor, introduce la contraseña'
                    ),

   );

}

Lo que hemos hecho es crear nuestra clase modelo que conectará con nuestra tabla users de la BD. También usamos la validación de los campos username y password del formulario que posteriormente crearemos en nuestra View.
Continuamos. Volvemos a nuestra carpeta de controladores y creamos un archivo llamado UsersController.php. La ruta será CarpetaAplicacion/app/Controller/UsersController.php. Aquí escribimos ahora el siguiente código:

<?php
App::uses('AppController','Controller');
/**
 * Users Controller
 *
 * @property User $User
 * @property PaginatorComponent $Paginator
 */
class UsersController extends AppController {

/**
 * Components
 *
 * @var array
 */
    public$components=array('Session');
 
    publicfunction autenticar(){
        // Aunque los campos username y password tienen validación para que no estén vacíos,
// volvemos a asegurarnos con el condicional que el campo username del formulario tiene
        //algún valor
        if(empty($this->data['User']['username'])==false)
        {
    	 //Consulta SQL para buscar al usuario con sus credenciales en la BD
$user=$this->User->find('all',array('conditions'=>array(
                'User.username'=>$this->data['User']['username'],
                'User.password'=>$this->data['User']['password'])));
         //Si se ha encontrado al usuario en la consulta
         if($user!=false)
         {
          //Si existe se redirecciona al usuario a la aplicación creando una variable de sesión 
          $this->Session->setFlash(__('Gracias por loguearse!'));
          $this->Session->write('User',$user);
          $this->Redirect(array('controller'=>'ControllerDeTuAplicacion','action'=>'index'));
          exit();
         }
         else
         {
//Si los datos no son correctos se comunica al usuario y se le devuelve al mismo
          //formulario de login
          $this->Session->setFlash(__('Nombre de usuario y/o password incorrectos'));
          $this->Redirect(array('action'=>'autenticar'));
          exit();
         }
        }
    }
}

Veamos qué hace nuestra clase controller. Es imprescindible, como en el archivo AppController, tener cargado el componente Session. Como podemos ver lo tenemos en nuestra variable pública $components. Lo primero que va a hacer la clase es comprobar que se han pasado datos en el campo username desde el formulario. Es cierto que los campos ya están validados desde nuestro Model, pero siempre es interesante comprobarlo también aquí. Si no es correcto, es decir, si el campo está vacío, entonces se redirecciona de nuevo al mismo formulario. De esto se encarga nuestro Model como sabemos, ya que al no haber ninguna variable Session creada reaccionará en consecuencia. Si, por el contrario, hay datos, se ejecuta una consulta en la BD para comprobar que, efectivamente, el usuario y password existen. Si no existen, entonces se le redireccciona al usuario de nuevo a la acción autenticar que hará que nuestro afterFilter del archivo AppController (¿Recuerdas?) compruebe que exista una variable de sesión. Como no es así se le reenvía automáticamente de nuevo al formulario con un mensaje flash indicando que uno o los dos campos no son correctos. Si existe el usuario, entonces se le redirecciona a la página index de la aplicación, no sin antes crear la variable de sesión que nos permitirá superar con éxito el método authenticate de nuestro AppController que es llamado automáticamente desde nuestro vigilante afterFilter.
Ya lo único que nos queda es crear nuestra View que mostrará el formulario para poder loguearse. Vamos a la ruta CarpetaAplicacion/app/View y creamos la carpeta Users. Despues, dentro de ella, creamos el archivo autenticar.ctp con el siguiente código:

<div>
<?php echo $this->Form->create('User'); ?>
	<fieldset>
		<legend><?php echo __('Login aplicación'); ?></legend>
	<?php
		echo $this->Form->input('username');
		echo $this->Form->input('password');
	?>
	</fieldset>
<?php echo $this->Form->end(__('Continuar')); ?>
</div>

Como se puede observar se trata de un simple formulario muy sencillo donde no creo que haya nada que explicar. Pues ya está, con esto hemos terminado. Ahora tenemos un sistema que permite proteger el acceso a nuestra aplicación de todos aquellos usuarios que, previamente, no estén en la base de datos. Obviamente, para poder probarlo, necesitamos entonces tener al menos un usuario en nuestra tabla users. Este ejemplo no contempla la posibilidad de registrarse pero creo que, con este punto de partida, no es nada complicado implementarlo. Pero eso lo dejo para vosotros 🙂 Un saludo.-

comentarios
  1. Antonio dice:

    Eres un maestro.

    Me gusta

  2. Hola quería preguntarte cómo hacer para controlar el acceso a las páginas si no estas logueado además de login y logout en cakephp??

    por favor es urgente y gracias de antemano

    Me gusta

  3. Porque probé el código y no me lleva a la página que quiero aqui esta lo q hice:

    UsuariosController:

    var $components = array(‘Session’);
    function login()
    {
    if (!empty($this->data)){
    $someone = $this->Usuario->findByLogin($this->data[‘Usuario’][‘login’]);
    if($someone[‘Usuario’][‘password’] == AuthComponent::password($this->data[‘Usuario’][‘password’])){
    $this->Session->write(‘Usuario’,$someone);
    $this->redirect(array(‘controller’=>’materiales’,’action’=>’index’));
    }
    else{
    $this->redirect(array(‘action’=>’mensaje’,0));
    }
    }
    }

    Usuario:

    class Usuario extends AppModel
    {
    var $validate = array
    (
    ‘login’ => array
    (
    ‘rule’ => array(‘minLength’, 1),
    ‘required’ => true,
    ‘allowEmpty’ => false,
    ‘message’ => ‘Por favor, introduce el login’
    ),
    ‘password’ => array
    (
    ‘rule’ => array(‘minLength’, 1),
    ‘required’ => true,
    ‘allowEmpty’ => false,
    ‘message’ => ‘Por favor, introduce la contraseña’

    ),
    ‘nombre’ => array
    (
    ‘rule’ => ‘notEmpty’,
    ‘required’ => true,
    ‘allowEmpty’ => false,
    ‘message’ => ‘Por favor, introduce tu nombre’
    )
    );
    public function beforeSave($options = array())
    {
    if(!empty($this->data[‘Usuario’][‘password’])) {
    $this->data[‘Usuario’][‘password’] = AuthComponent::password($this->data[‘Usuario’][‘password’]);
    }
    else {
    unset($this->data[‘Usuario’][‘password’]);
    }
    return true;
    }
    }

    AppController:

    class AppController extends Controller
    {

    var $components=array(‘Session’);
    function authenticate()
    {
    if(!$this->Session->check(‘Usuario’))
    {
    $this->redirect(array(‘controller’=>’usuarios’,’action’=>’login’));
    // exit();
    }

    }
    function afterFilter()
    {
    if($this->action!=’login’)
    {
    $this->authenticate();
    }
    }
    }

    login.ctp:

    Session->flash(‘auth’);
    echo $this->Form->create(‘Usuario’);
    ?>

    Form->input(‘login’); ?>
    Form->input(‘password’); ?>
    Form->submit(‘Entrar’); ?>

    Html->link(‘Guardar’, array(‘action’=>’add’));?>

    por favor ayudame.

    Me gusta

    • Hola. Perdona por el retraso en responderte pero he estado fuera y no he podido atender el blog durante estos días.
      Primero comentarte que el ejemplo que expongo en el blog es sin la utilización de AuthComponent ya que, como comento al principio del post, hay mucha gente que se encuentra con diversos problemas debido a la versión del framework o por cualquier otro.
      Por otro lado, el ejemplo está probado bajo la versión 2.4.4.
      Veo en tu código que usas AuthComponent con lo que entramos en el universo de problemas que suele conllevar esto.
      No sé qué versión estás usando pero observo que declaras la variable $components con var y no con public, tal y como puedes ver en el ejemplo. Esto lo tienes así tanto en el archivo UsuariosController como en AppController. Además deberías cerciorarte de que las importaciones correspondientes las tienes correctamente implementadas. Me refiero a, por ejemplo, la importación de App::uses(‘Controller’,’Controller’); en el archivo AppController o App::uses(‘AppModel’,’Model’); en el archivo Usuario.php en tu caso.
      No puedo ayudarte más sin disponer de algo más de información. Si quieres puedes subir tu proyecto a Github o Dropbox y me envías el enlace por privado para poder descargarlo y verlo en detalle. Mi direccion de correo es hardwebnet@hardwebnet.es
      De todas formas, si pruebas el ejemplo del post siguiendo todos los pasos no tendrás ningún problema. Asegúrate también de tener datos en la BD para que el login pueda comprobar las credenciales en caso de ser correctas.

      Me gusta

  4. La versión que utilizo es la versión 2.5.1, dime tienes tiemviewer para trabajar remotamente asi me podés dar la gran ayuda…..

    espero tu respuesta.

    Me gusta

    • Hola de nuevo.
      Lo cierto es que no he probado el código del ejemplo en la versión que comentas.
      Teamviewer no es conveniente en este caso porque necesito ver el código y probarlo en local en mi pc. La conexión ralentizaría esto además de que sería muy pesado esperar por tu parte mientras puedo tardar un buen rato en descubrir qué te falla.
      De todos modos, insisto, si necesitas en funcionamiento el ejemplo que propongo, deberías usar la versión 2.4.4 del framework y seguir los pasos del tutorial. Te garantizo que funciona sin problemas.
      En caso contrario, sube tu proyecto a la nube y le echo un vistazo,
      Muchas gracias por visitar mi blog. Un saludo.-

      Me gusta

  5. Resolví un problema, ahora el login me anda bien, todo lo que tuve que cambiar era esto:

    En AppController:

    array
    (
    ‘authorize’ => ‘Controller’,
    ‘actionPath’ => ‘controllers/’,
    ‘authenticate’ => array
    (
    ‘Form’ => array
    (
    ‘userModel’ => ‘Usuario’,
    ‘fields’ => array
    (
    ‘username’ => ‘login’,
    ‘password’=>’password’
    )
    )
    ),
    ‘loginAction’ => array
    (
    ‘controller’ => ‘usuarios’,
    ‘action’ => ‘login’,
    ),
    ‘loginRedirect’ => array
    (
    ‘controller’ => ‘materiales’,
    ‘action’ => ‘index’
    ),
    ‘logoutRedirect’ => array
    (
    ‘controller’ => ‘usuarios’,
    ‘action’ => ‘login’
    )
    )
    );
    public function isAuthorized() {
    return true;
    }
    }

    UsuariosController:

    request->is(‘post’)) {
    if (!empty($this->request->data[‘Usuario’]) && $this->Auth->login()) {
    $this->redirect($this->Auth->redirect());
    }
    else {
    $this->Session->setFlash(__(‘Invalid username or password, try again’));
    }
    }
    }
    public function logout() {
    return $this->redirect($this->Auth->logout());
    }
    function add()
    {
    if(!empty($this->data))
    {
    if($this->Usuario->save($this->data)){
    $this->Session->setFlash(‘Usuario Guardado’);
    $this->redirect(array(‘action’=>’login’));
    }
    }
    }
    }

    ahora pasa lo sgte en views/materiales/index.ctp:

    Session->read(‘usuario’)==’1′): ?>

    Mantenimiento de Materiales

    Html->link(‘Guardar’,array(‘action’=>’add’));
    echo «»;
    echo $this->Html->link(‘Volver’, ‘/usuarios/login’, array(‘class’ => ‘button’));
    if(empty($materiales)):
    ?>

    No hay Materiales en la BD

    Material
    Código
    Nombre

    Html->link(‘Editar’,array(‘action’=>’edit’,$persona[‘Persona’][‘id’])); ?>
    Html->link(‘Borrar’,array(‘action’=>’delete’,$persona[‘Persona’][‘id’]),array(‘confirm’ => ‘¿Estás Seguro?’)); ?>

    <!– Debes loguearte para entrar–>

    las líneas comentadas son para asegurarme de que sólo pueden entrar a las páginas los usuarios logueados, pero asegurarme bien de eso, tengo que tocar algo de MaterialesController y UsuariosController o no??

    Saludos

    Me gusta

  6. En principio no, porque veo que AppController se encarga de todo. Si el usuario no está logueado, no va a poder acceder a materiales index.
    De todas formas, lo mejor es que añadas items a la BD y compruebes todas las posibilidades para asegurarte de que, efectivamente, solo se puede acceder a donde tú quieres si se está loguedo. Ya me cuentas.

    Me gusta

  7. Froylan Gonzalez dice:

    Y como hacerle para terminar sesion una vez que ingrese?

    Me gusta

  8. Hola detectivejd23j.
    Realmente este post era algo independiente, sin ánimo de ampliarlo a otras cuestiones sobre CakePHP. Pero, evidentemente, si tienes alguna consulta, algún problema, o alguna duda sobre este genial framework, solo tienes que plantearla e intentaré darte una respuesta lo antes posible.

    Me gusta

  9. Entonces dime: cómo hago para asegurarme que tipo de usuario entran en cierto tipo de paginas??

    cómo hago para destruir la sesion y que me lleve a otra página??

    xq hasta ahora sólo puedo loguearme, nada más.

    Me gusta

    • Hola de nuevo detectivejdej. Veamos:
      Para destruir una sesión simplemente has de usar:
      $this->Session->destroy();
      Para redirigir:

      $this->redirect(array(«controller» => «myController»,
      «action» => «myAction»,
      «param1» => «val1»,
      «param2» => «val2»,
      $data_can_be_passed_here),
      $status,
      $exit);

      Para controlar el acceso de determinados usuarios te recomiendo la documentación oficial:

      http://book.cakephp.org/1.3/es/The-Manual/Core-Components/Access-Control-Lists.html

      Si tienes alguna consulta adicional no dejes de comunicármelo. Gracias por tu visita.

      Me gusta

      • ante todo Juan gracias x responder, verás me estoy basando mucho en este link del manual de cake:

        http://book.cakephp.org/2.0/en/tutorials-and-examples/blog-auth-example/auth.html

        y no tengo idea de cómo encajar la parte de permisos con el ejemplo xq esto tengo:

        cómo controladores:

        request->is(‘post’)) {
        if (!empty($this->request->data[‘Usuario’]) && $this->Auth->login()) {
        $this->redirect($this->Auth->redirect());
        }
        else {
        $this->Session->setFlash(__(‘Invalid username or password, try again’));
        }
        }
        else{
        if($this->Auth->user(‘id’)){
        $this->redirect($this->Auth->redirect());
        }
        }
        }
        public function logout() {
        return $this->redirect($this->Auth->logout());
        }
        function add()
        {
        if(!empty($this->data))
        {
        if($this->Usuario->save($this->data)){
        $this->Session->setFlash(‘Usuario Guardado’);
        $this->redirect(array(‘action’=>’login’));
        }
        }
        }
        }

        set(‘materiales’,$this->Materiale->find(‘all’));

        }
        function add()
        {
        if(!empty($this->data)) {
        if($this->Materiale->save($this->data)){
        $this->Session->setFlash(‘Material Guardado’);
        $this->redirect(array(‘action’=>’index’));
        }
        }
        }
        }

        Modelos:

        array
        (
        ‘rule’ => array(‘minLength’, 1),
        ‘required’ => true,
        ‘allowEmpty’ => false,
        ‘message’ => ‘Por favor, introduce el login’
        ),
        ‘password’ => array
        (
        ‘rule’ => array(‘minLength’, 1),
        ‘required’ => true,
        ‘allowEmpty’ => false,
        ‘message’ => ‘Por favor, introduce la contraseña’

        ),
        ‘nombre’ => array
        (
        ‘rule’ => ‘notEmpty’,
        ‘required’ => true,
        ‘allowEmpty’ => false,
        ‘message’ => ‘Por favor, introduce tu nombre’
        ),
        ‘role’ => array(
        ‘valid’ => array(
        ‘rule’ => array(‘inList’, array(‘admin’, ‘author’)),
        ‘message’ => ‘Please enter a valid role’,
        ‘allowEmpty’ => false
        )
        )
        );
        public function beforeSave($options = array())
        {
        if(!empty($this->data[‘Usuario’][‘password’])) {
        $this->data[‘Usuario’][‘password’] = AuthComponent::password($this->data[‘Usuario’][‘password’]);
        }
        else {
        unset($this->data[‘Usuario’][‘password’]);
        }
        return true;
        }
        }

        array
        (
        ‘novacio’=>array
        (
        ‘rule’=>’notEmpty’,
        ‘message’=>’Ingrese código del material’
        ),
        ‘unico’=>array
        (
        ‘rule’=>’isUnique’,
        ‘message’=>’El material ya existe’
        )
        ),
        ‘nombre’=>array
        (
        ‘rule’=>’notEmpty’,
        ‘message’=>’Ingrese nombre del material’
        )
        );
        }

        Vistas:

        usuarios:

        add.ctp

        Form->create(‘Usuario’); ?>

        Form->input(‘login’); ?>
        Form->input(‘password’); ?>
        Form->input(‘nombre’); ?>
        Form->submit(‘Aceptar’); ?>

        login.ctp

        Session->flash(‘auth’);
        echo $this->Form->create(‘Usuario’);
        ?>

        Form->input(‘login’,array(‘type’=>’text’,’label’=>’Login del Usuario:’)); ?>
        Form->input(‘password’,array(‘type’=>’password’,’label’=>’Contraseña:’)); ?>
        Form->end(‘Entrar’); ?>

        Html->link(‘Guardar’, array(‘action’=>’add’));?>

        materiales:

        add.ctp

        Form->create(‘Materiale’); ?>

        Form->input(‘codigo’); ?>
        Form->input(‘nombre’); ?>
        Form->submit(‘Aceptar’); ?>

        index.ctp

        Session->read(‘usuario’)==’1′): ?>

        Mantenimiento de Materiales

        Html->link(‘Guardar’,array(‘action’=>’add’));
        echo «»;
        echo $this->Html->link(‘Volver’, ‘/usuarios/login’, array(‘class’ => ‘button’));
        if(empty($materiales)):
        ?>

        No hay Materiales en la BD

        Material
        Código
        Nombre

        Html->link(‘Editar’,array(‘action’=>’edit’,$persona[‘Persona’][‘id’])); ?>
        Html->link(‘Borrar’,array(‘action’=>’delete’,$persona[‘Persona’][‘id’]),array(‘confirm’ => ‘¿Estás Seguro?’)); ?>

        <?php
        /* else:
        echo "Debes loguearte para entrar«;
        endif;*/

        pero no sé cómo seguirlo, ten en cuenta que recién empiezo con cakephp.

        PD: tienes algún correo cómo para que te consulte, digo para no hacer esto largo en tu sitio.

        Me gusta

  10. Hola de nuevo detectivejd23.
    Lo primero gracias a ti por interesarte por mi blog.
    Verás, hay que hacer una diferenciación entre autenticación y autorización. Por lo que veo, y me comentas, lo que tienes es un problema de autorización.
    Lo cierto es que este post solo trata de autenticarse, es decir, de estar logueado en el sistema, pero no trata nada acerca de qué usuarios logueados tienen qué permisos y entonces a qué partes de la aplicación pueden acceder y a cuáles no. Eso es la autorización.
    Bien, una vez aclarado esto, mi correo personal es hardwebnet@hardwebnet.es.
    Por favor, envíame ahí de nuevo este código y trataré de darte una posible solución en cuanto me sea posible,
    Muchas gracias de nuevo y un saludo.-

    Me gusta

  11. Reumo dice:

    Tengo problemas con AurhComponent, a ver si sabes como resolverlo.
    Puse lo datos con add para que la password este codificada

    No Consigo que me loguee
    Me Saca el flash «Invalid username or password, try again»
    Tengo que usar la tabla que relaciona el modelo PintiplanAutore y no puedo usar una tabla users

    Uso el Cake 2.5.6

    Esto es mi appContoller:

    class AppController extends Controller {
    public $components=array(
    ‘Session’,
    ‘Auth’ => array(

    ‘authenticate’=>array(
    ‘Form’=>array(
    ‘userModel’=>’PintiplanAutore’,
    ‘fields’ => array(
    ‘passwordHasher’ => ‘Blowfish’,
    ‘username’ => ‘correo’,
    ‘password’=>’password’
    )
    )
    )

    )
    );

    public function beforeFilter(){
    $this->Auth->allow(‘index’);
    $this->Auth->loginAction = array(‘controller’ => ‘PintiplanAutores’,’action’=>’login’);
    $this->Auth->loginRedirect = array(‘controller’ => ‘Nosotros’, ‘action’ => ‘index’);
    }

    }

    esto es el controller:

    Auth->allow(‘add’,’logout’);
    }
    /**
    * add method
    *
    * @return void
    */
    public function add() {
    if ($this->request->is(‘post’)) {
    $this->PintiplanAutore->create();
    if ($this->PintiplanAutore->save($this->request->data)) {
    $this->Session->setFlash(__(‘The pintiplan autore has been saved.’));
    return $this->redirect(array(‘action’ => ‘index’));
    } else {
    $this->Session->setFlash(__(‘The pintiplan autore could not be saved. Please, try again.’));
    }
    }
    }

    public function login(){
    if ($this->request->is(‘post’)) {
    //echo debug($this->request->data[‘Login’][‘password’]);
    if ($this->Auth->login()) {
    //return $this->redirect(array(‘controller’ => ‘Nosotros’, ‘action’ => ‘index’));
    return $this->redirect($this->Auth->redirectUrl());
    }

    $this->Session->setFlash(__(‘Invalid username or password, try again’));

    }
    }

    public function logout() {
    return $this->redirect($this->Auth->logout());
    }
    }

    Vista de login:

    Form->create(‘PintiplanAutores’);
    /
    echo $this->Form->input(‘correo’);
    echo $this->Form->input(‘password’);
    echo $this->Form->end(‘Login’);

    ?>
    Session->flash(‘auth’); ?>

    y mi modelo para los usuario:

    array(
    ‘required’ => array(
    ‘rule’ => array(‘notEmpty’),
    ‘message’ => ‘A username is required’
    )
    ),
    ‘correo’ => array(
    ‘required’ => array(
    ‘rule’ => array(‘notEmpty’),
    ‘message’ => ‘A correo is required’
    )
    ),
    ‘password’ => array(
    ‘required’ => array(
    ‘rule’ => array(‘notEmpty’),
    ‘message’ => ‘A password is required’
    )
    ),
    ‘rol’ => array(
    ‘valid’ => array(
    ‘rule’ => array(‘inList’, array(‘admin’, ‘author’)),
    ‘message’ => ‘Please enter a valid role’,
    ‘allowEmpty’ => false
    )
    )
    );
    /**
    * hasMany associations
    *
    * @var array
    */
    public $hasMany = array(
    ‘autorPlanes’ => array(
    ‘className’ => ‘PintiplanAutore’,
    ‘foreignKey’ => ‘idautor’,
    ‘dependent’ => false,
    ‘conditions’ => »,
    ‘fields’ => »,
    ‘order’ => »,
    ‘limit’ => »,
    ‘offset’ => »,
    ‘exclusive’ => »,
    ‘finderQuery’ => »,
    ‘counterQuery’ => »
    ),
    ‘autorSitios’ => array(
    ‘className’ => ‘PintiplanSitio’,
    ‘foreignKey’ => ‘idautor’,
    ‘dependent’ => false,
    ‘conditions’ => »,
    ‘fields’ => »,
    ‘order’ => »,
    ‘limit’ => »,
    ‘offset’ => »,
    ‘exclusive’ => »,
    ‘finderQuery’ => »,
    ‘counterQuery’ => »
    ),
    ‘autorPlanesSitios’ => array(
    ‘className’ => ‘PintiplanPlanesSitio’,
    ‘foreignKey’ => ‘idautor’,
    ‘dependent’ => false,
    ‘conditions’ => »,
    ‘fields’ => »,
    ‘order’ => »,
    ‘limit’ => »,
    ‘offset’ => »,
    ‘exclusive’ => »,
    ‘finderQuery’ => »,
    ‘counterQuery’ => »
    )
    );
    public function beforeSave($options = array()) {
    if (isset($this->data[$this->alias][‘password’])) {
    $passwordHasher = new BlowfishPasswordHasher();
    $this->data[$this->alias][‘password’] = $passwordHasher->hash(
    $this->data[$this->alias][‘password’]
    );
    }
    return true;
    }

    }

    Me gusta

    • Hola Reumo.
      Creo que deberías replantearte el proyecto.
      Lo primero que necesitas es que al principo el authcomponent controle que te redireccione siempre a un formulario de registro. Si el registro no coincide con ningún usuario ya registrado entonces lo añades y lo vuelves a redirigir al formulario de registro. Todo esto lo puedes hacer desde el AppController. Lo que necesitas sí o sí es un model users para saber si ya está registrado o no. Si ya lo está al rellenar el formulario entonces le dejas paso, sino lo añades a la BBDD y lo rediriges al formulario de registro para volver a comprobar las credenciales y si son correctas crear la sesión. Entonces, y solo entonces, si son correctas las credenciales, le rediriges a la página oportuna de la aplicación.
      Inténtalo por tu cuenta. Si tienes algún problema vuelve a escribirme y lo vemos. Lo mejor para aprender es que lo intentes tú solo.
      Un saludo y gracias por visitar el blog.-

      Me gusta

  12. Miguel dice:

    Hola amigo al momento de logearme me pide una clase ControllerDeTuAplicationController extends, podrias ayudarme en eso?

    Me gusta

    • Hola.
      Ese error significa que no puede encontrar el controller o la acción del controller con el que debe seguir operando. Asegúrate de haber seguido correctamente las normas a la hora de poner nombre al Controller. También asegúrate de haber conectado correctamente con la base de datos y de haber creado correctamente el modelo correspondiente. Comprueba igualmente que el AppController redirige correctamente al controller y su acción correspondiente.

      Me gusta

  13. YhonnyYAK dice:

    Hola amigo, te comento q trabajo con cakephp 1.3 en la cual yo puedo generar un controlador de seguridad y claro uso el Auth, y este lo asocio a otro controlador q deseo q tenga la seguridad :

    App::import(‘controller’,’seguridad’)
    Class PanelController exten SeguridadController {
    }

    el objetivo de esto era que el controlador publico osea para las paginas publicas no tengan permiso y siguen siendo un AppController y solo asocio el controlafor seguridad para la parte administrable .

    El problema esque e tratado de hacer lo mismo en la versin 2.x pero no me afuncionado noce si tendras una. Solucion similar para separar la parte publica con la administrable q son los mantenimientos, agradesco tu ayuda . Saludos

    Me gusta

    • Hola. Antes de nada quiero agradecerte la visita a mi blog.
      A partir de la versión 2.x de Cakephp muchas cosas cambian a mejor, sobre todo en cuestiones de seguridad.
      Por lo que entiendo de tu comentario, tu problema está en la autorización y no en la autenticación de la aplicación.
      Te invito a que visites otro de mis post acerca de Cakephp sobre este tema. Lo puedes encontrar en esta dirección:

      Registro, autenticación y autorización basada en roles CakePHP 2.6

      Espero que te sirva de ayuda. Si aún así te encuentras con problemas, házmelo saber para que puedas enviarme el código por privado y ver qué solución podemos darle.
      Un saludo.-

      Me gusta

Replica a Antonio Cancelar la respuesta