2
votes

I am working on a simple login application with cake 2.4 for my mom. here is the code for User model.

App::uses('SimplePasswordHasher', 'Controller/Component/Auth');

class User extends AppModel{
        public $validate = array(
                'username' => array(
                        'required' => array(
                                'rule' => array('notEmpty'),
                                'message' => 'A username is required'
                        )
                ),
                'password' => array(
                        'required' => array(
                                'rule' => array('notEmpty'),
                                'message' => 'A password is required'
                        )
                )
        );

        public function beforeSave($options = array()) {
                if(isset($this->data[$this->alias]['password'])) {
                        $passwordHasher = new SimplePasswordHasher();
                        $this->data[$this->alias]['password'] = $passwordHasher->hash(
                        $this->data[$this->alias]['password']
                        );
                }
                return true;
        }
}

My UsersController code is...

class UsersController extends AppController{
        public $helpers = array('Html','Form');

        public function beforeFilter(){
                parent::beforeFilter();
                $this->Auth->allow('add');
        }
        public function add(){
                if($this->request->is('post')){
                        $this->User->create();
                        if($this->User->save($this->request->data)){
                                $this->Session->setFlash(__('The user has been saved'));
                                return $this->redirect(array('action' => 'index'));
                        }
                        $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
                }
        }
        public function login(){
                $this->layout = 'mlayout';
                if($this->request->is('post')){
                        debug($this->Auth->login());
                        var_dump($this->request->data);
                        if($this->Auth->login()){
                                $this->Session->setFlash('Logged In');
                                //return $this->redirect($this->Auth->redirectUrl());
                        }else{
                                $this->Session->setFlash(__('Usuario o Contraseña invalido, intentelo de nuevo.'));
                        }
                }
        }
        public function logout(){
                return $this->redirect($this->Auth->logout());
        }
}

AppController code:

class AppController extends Controller{

        public $components = array('Session',
                'Auth' => array(
                        'loginRedirect' => array(
                                'controller' => 'homes',
                                'action' => 'index'
                        ),
                        'logoutRedirect' => array(
                                'controller' => 'homes',
                                'action' => 'index'
                        )
                )
        );

        public function beforeFilter(){
                $this->Auth->allow('index','view','login');
        }
}

Login.ctp

                <table id="formtable">
                <form id="UserForm" method="post" action="/mercadito/users/login">
                <tr>
                        <td align="right">Login -> </td>
                        <td><input type="text" name="username" style="width: 150px; height: 30px;"/></td>
                </tr>
                <tr>
                        <td align="right">Contraseña -> </td>
                        <td><input type="password" name="password" style="width: 150px; height: 30px;"/></td>
                </tr>
                <tr>
                        <td></td>
                        <td align="center"><input type="submit" value="ENTRAR" style="width: 100px; height: 30px;"/></td>
                </tr>
                </form>
                </table>

debug($this->Auth->login()) returns: /app/Controller/UsersController.php (line 23) true

var_dump() returns: array(2) { ["username"]=> string(9) "ddfdsffsd" ["password"]=> string(9) "fdsfdssfd" }

This happens every time, whatever the input in the login form.

1
Try putting in your Auth array: 'authenticate' => array('Form')Roberto Maldonado

1 Answers

1
votes

You need to configure an authorization handler to use the beforeFilter in your controller see: Configuring Authorization handlers

Add 'authorize' => 'Controller' to your AppController:

class AppController extends Controller{

     public $components = array('Session',
            'Auth' => array(
                    'loginRedirect' => array(
                            'controller' => 'homes',
                            'action' => 'index'
                    ),
                    'logoutRedirect' => array(
                            'controller' => 'homes',
                            'action' => 'index'
                    ),
                    'authorize' => 'Controller'
            )
    );

    public function beforeFilter(){
            $this->Auth->allow('index','view','login');
    }

}