PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Friday, March 18, 2022

[FIXED] Cakephp 2.0 $this->Auth->login() not working

 March 18, 2022     authentication, cakephp, login     No comments   

Issue

I'm trying to use the cakephp built in Auth for a user login. I've managed to validate a user registration (which is located on the same view as the login) but not get the login working.

All i get when trying to login is my 'Invalid username or password, try again' error. I've gone through the blog tutorial but I'm new to cake/php and have only worked on messy projects in 1.3 that sue their own crude authentication.

MarshallsController.php

class MarshalsController extends AppController {
public $helpers     = array('Html', 'Form');
public $uses        = array("Marshal", "User");
public $components  = array("RequestHandler","Session", "Auth");

public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('register', 'login');
}

public function index() {
    $this->set('users', $this->User->find('all',
            array(
                'conditions'=>array(
                    'User.marshall_id'=>$Marshall['Marshall']['id']
                )
            )));
}

//Run when Marshal attempts to register for login page
public function register(){
    if ($this->request->is('post')) {
        $this->Marshal->create();
        if ($this->Marshal->save($this->request->data)) {
            //if new marshall has been saved fetch all their data
            $marshal = $this->Marshal->find('first',
                array(
                    'conditions'=>array(
                        "Marshal.email"     => $this->data['Marshal']['email'],
                    )
                )
            );
            if(!empty($marshal)){
                //set marshal session data to track logged in users and their data
                $this->Session->write("Marshal",$marshal);
            }
            $this->Session->setFlash(__('The Marshal has been saved'));
            //redirect user to logged in page
            $this->redirect(array('controller' => 'pages', 'action' => 'home'));
        } else {
            $this->Session->setFlash(__('The Marshal could not be saved. Please, try again.'));
            echo $this->render('login');
            exit();
        }
    }
    else{
        //if Marshal has not attempted to login redirect the back to the login/register page
        echo $this->render('login');
        exit();
    }
}


public function login() {

    //if user has atempted a login
    if ($this->request->is('post')) {
        if ($this->Auth->login()) {
            //If login detials are correct get user data
            $marshal = $this->Marshal->find('first',
                array(
                    'conditions'=>array(
                        "Marshal.email"     => $this->data['Marshal']['email'],
                    )
                )
            );
            if(!empty($marshal)){
                //set marshal session data to track logged in users and their data
                $this->Session->write("Marshal",$marshal);
            }
            //redirect user to the logged in page
            $this->redirect($this->Auth->redirect());
        } else {
            $this->Session->setFlash(__('Invalid username or password, try again'));
            debug($this->Auth->request->data);
        }

Marshal model

class Marshal extends AppModel {

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

public $hasMany = array(
    'User' => array(
        'className'     => 'User',
        'foreignKey'    => 'marshal_id',
        'conditions'    => array('User.status' => '1'),
    )
);

public $validate = array(
    'first_name' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'A first name is required'
        )
    ),
    'last_name' => array(
        'required' => array(
            'rule' => array('notempty'),
            'message' => 'A last name is required'
        )
    ),
    'password' => array(
        'required' => array(
            'rule'    => array('minLength', '8'),
            'message' => 'Minimum 8 characters long'
        )
    ),
    'email' => 'email'
);

}

login.ctp

<div class="row">
<?php echo $this->Session->flash('auth'); ?>
<div class="sixcol">
    <?php
    echo $this->Form->create('Marshal', array('action' => 'login'));
    echo $this->Form->inputs(array(
        'legend' => __('Login'),
        'email',
        'password'
    ));
    echo $this->Form->end('Login');
    ?>
</div>
<div class="sixcol last">
    <?php
    echo $this->Form->create('Marshal', array('action' => 'register'));
    echo $this->Form->inputs(array(
        'legend' => __('register'),
        'first_name',
        'last_name',
        'email',
        'password'
    ));
    echo $this->Form->end('Register');
    ?>
</div>


Solution

By default, CakePHP uses username and password fields but you have email instead of username. You need to specify it:

public $components = array(
            'Auth' => array('authenticate' => array('Form' => array( 'userModel' => 'User',
                                    'fields' => array(
                                                        'username' => 'email',
                                                        'password' => 'password'
                                                        )
                                                )
                            ),
                    'authorize' => array('Controller'),
                    'loginAction' => array('controller' => 'users', 'action' => 'login'),
                    'loginRedirect' => array('controller' => 'home', 'action' => 'index'),
                    'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
                    'authError' => 'You don\'t have access here.',
            ),
        );

This is my working example, feel free to change it for your needs.



Answered By - user2027495
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home
View mobile version

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing