CakePHP 2.0: Login form not working - cakephp-2.0

I m trying to create a new register and login page. I have a problem in login.
1) After I register the Username and Password it is successful hashed and saved into the DB, please find the codes below: (everything is as per cake conventions)
User.php:
<?php
App::uses('AuthComponent', 'Controller/Component');
class User extends AppModel {
......
public function beforeSave() {
if (isset($this->data[$this->alias]['password'])) {
$this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
}
return true;
}
}
?>
UsersController.php:
public function add() {
if ($this->request->is('post')) {
$this->User->create();
if ($this->User->saveAll($this->request->data)) {
$this->Session->setFlash(__('The user has been saved'));
$this->redirect(array('controller' => 'Posts','action' => 'index'));
} else {
$this->Session->setFlash(__('The user could not be saved. Please, try again.'));
}
}
}
public function login() {
if ($this->Auth->login()) {
$this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash(__('Invalid username or password, try again'), 'default', array(), 'auth');
}
}
public function logout() {
$this->redirect($this->Auth->logout());
}
login.ctp:
<fieldset>
<?php echo $this->Session->flash('auth'); ?>
</fieldset>
<?php echo $this->Form->create('Users');?>
<fieldset>
<?php
echo $this->Form->input('username');
echo $this->Form->input('password');
?>
</fieldset>
<?php echo $this->Form->end(__('Login'));?>
Debug: (debug($this->data);)
From AppController:
Array
(
[Users] => Array
(
[username] => vinodronold
[password] => vinodronold
)
)
From UsersController:
Array
(
[Users] => Array
(
[username] => vinodronold
[password] => vinodronold
)
)
Problem:
Whenever I access /Users/login URL I m getting "Invalid username or password, try again" message.
Also I m unable to login although I m entering the correct username and password.
Please help.
Thanks in advance!!!

Looking at it closer, change your if statement on the login function to this:
if (!empty($this->request->data['User']) && $this->Auth->login()) {
this will fix the instant error message you get when accessing the page.
And I just noticed your form in your view is wrong. Models are singular. Change your form create to:
<?php echo $this->Form->create('User');?>
This should do it for both issues.

Related

CakePHP2.4 Login and Redirect doesn't work on server

I'm using cakePHP building a website. The login function works fine in local, but after I post them onto the server, I cannot login with existing username and password. The page doesn't either let me log in, or give me an error message which is supposed to show up when there are issues. I tried almost every solution in stackoverflow but can't solve it. Here's my code.
Model:
class User extends AppModel {
public function beforeSave($options = array()) {
/* password hashing */
if (isset($this->data[$this->alias]['password'])) {
$this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
}
return true;
}
}
AppController:
class AppController extends Controller {
public function webroot() {
}
public $components = array('DebugKit.Toolbar','Session',
/* add Auth component and set the urls that will be loaded after the login and logout actions is performed */
'Auth' => array(
'loginRedirect' => array('controller' => 'Home', 'action' => 'index'),
'logoutRedirect' => array('controller' => 'users', 'action' => 'login')
)
);
public function beforeFilter() {
/* set actions that will not require login */
$this->Auth->allow('index','display', 'view');
}
}
UsersController:
class UsersController extends AppController {
public $components = array('Auth');
public function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('add', 'logout');
}
public function login() {
if ($this->request->is('post')) {
/* login and redirect to url set in app controller */
if ($this->Auth->login()) {
return $this->redirect($this->Auth->redirect('/Home'));
}
$this->Session->setFlash(__('Invalid username or password, try again'));
}
}
public function logout() {
/* logout and redirect to url set in app controller */
return $this->redirect($this->Auth->logout());
}
public function index() {
$this->User->recursive = 0;
$this->set('Users', $this->paginate());
}
public function add() {
if ($this->request->is('post')) {
$this->User->create();
if ($this->User->save($this->request->data)) {
$this->Session->setFlash;
return $this->redirect(array('controller' => 'Home','action' => 'index'));
}
$this->Session->setFlash(__('The user could not be saved. Please, try again.'));
}
}
}
View:
<?php echo $this->Session->flash('auth'); ?>
<?php echo $this->Form->create('User'); ?>
<fieldset>
<legend><?php echo __('Please enter your username and password'); ?></legend>
<?php echo $this->Form->input('username');
echo $this->Form->input('password');?>
</fieldset>
<?php echo $this->Form->end(__('Login')); ?>
Another glitch I think I should mention is, as the code shows, when I add a new username and pw, the page should redirect me to Home. This also works fine locally, but on server it doesn't redirect, HOWEVER, the username and password is successfully stored into database when I added it.
I'm really stuck and have no clue what the problem is, any help is appreciated, thanks.
Update
errors in error.log :
2014-05-14 05:16:21 Error: [MissingActionException] Action UsersController::js() could not be found.
Exception Attributes: array (
'controller' => 'UsersController',
'action' => 'js',
)
Request URL: /users/js/lightbox.min.js
2014-05-14 05:16:21 Error: [MissingActionException] Action UsersController::js() could not be found.
Exception Attributes: array (
'controller' => 'UsersController',
'action' => 'js',
)
Request URL: /users/js/jquery-1.11.0.min.js

Cakephp auth is not working on production

Guys I uploaded my site on servers and I'm facing this problem.
Usercontroller.php
<?php
class UsersController extends AppController {
var $name = 'Users';
var $components = array('Auth', 'Acl');
function beforeFilter(){
//parent::beforeFilter();
$this->Auth->loginError = "asdad!";
$this->Auth->authError = "sdsd !.";
App::uses('CakeEmail', 'Network/Email');
$this->Auth->userModel = 'User';
$this->Auth->allow('login','register','login','step2','TakeId','kontakt');
}
function login(){
if(!empty($this->data)){
$this->request->data['User']['password'] = AuthComponent::password($this->request->data['User']['password']);
$sprawdz = $this->User->find('first',array('conditions'=>array('User.username'=>$this->request->data['User']['username'],'User.password'=>$this->request->data['User']['password'])));
echo debug($sprawdz);
if(!empty($sprawdz)){
if($this->Auth->login($this->request->data)){
$this->redirect('/');
echo debug('you are log in!') ;
}
}
else {
$this->User->invalidate('username', 'mistake!');
}
}
}
function logout(){
$this->Auth->logout();
$this->redirect('/');
}
}
User/login.ctp
<?php echo $this->Session->flash('auth'); ?>
<?php echo $this->Form->create('User'); ?>
<fieldset>
<?php echo $this->Form->input('username');
echo $this->Form->input('password'); ?>
</fieldset>
<?php echo $this->Form->end(__('Log in')); ?>
It is like Auth does not work at all. In localhost was fine. Additionaly, users/index is empty page :)
Any ideas would be great. Thanks.
Keep it simple, and follow the tutorial which shows how to use the auth component.
For example, try this:
function login(){
if ($this->request->is('post')) {
if ($this->Auth->login()) {
$this->Session->setFlash('You have successfully logged in the system');
return $this->redirect('/');
}
$this->Session->setFlash(__('Invalid username or password, try again [warning]'));
}
}
Also please make sure Security.Salt which is responsible to hash a password with the application's salt value
You did not defined any index function in usersController, that is why it is throwing error. Try to enable debug mode on so that you can track the errors
add $this->request->data on 2nd line of your login aciton-
function login(){
if(!empty($this->request->data)){
$this->request->data['User']['password'] = AuthComponent::password($this->request->data['User']['password']);
$sprawdz = $this->User->find('first',array('conditions'=>array('User.username'=>$this->request->data['User']['username'],'User.password'=>$this->request->data['User']['password'])));
echo debug($sprawdz);
if(!empty($sprawdz)){
if($this->Auth->login()){
$this->redirect('/');
echo debug('you are log in!') ;
}
}
else {
$this->Session->setFlash('Invalid username or password');
}
}
}

Auth component with employee model; logging in without checking credentials

Im trying to use Employee model instead of User model in Auth component. My code is:
AppController
public $components = array('Session','Auth');
function beforeFilter(){
Security::setHash('md5');
$this->Auth->userModel = 'Employee';
$this->Auth->fields = array('username'=>'code','password'=>'password');
$this->Auth->loginAction = array('controller'=>'employees','action'=>'login');
$this->Auth->loginRedirect = array('controller'=>'pages','action'=>'home');
$this->Auth->loginError = 'Invalid employee code or password, please try again';
$this->Auth->logoutRedirect = array('controller'=>'employees','action'=>'login');
}
function beforeRender(){
$this->set('Employee',$this->Auth->user());
}
EmployeeController
function login(){
$this->layout = 'login';
}
function logout(){
$this->Redirect($this->Auth->logout());
}
function beforeFilter(){
parent::beforeFilter();
$this->Auth->allow('signup');
}
function beforeRender(){
parent::beforeRender();
}
login.ctp
<?php
echo $this->Form->create('Employee',array('/employees/login'));
echo $this->Form->input('code',array('label'=>'Employee code'));
echo $this->Form->input('password');
echo $this->Form->submit('Sign in',array('class'=>'b-button'));
echo $this->Form->end();
?>
The problem is, when i click the login button, page simply refreshes. No redirect, noerror messages, no nothing.
Is there any mistake in what im doing?
EDIT
function login(){
$this->layout = 'login';
if($this->request->is('post')){
if($this->Auth->login($this->request->data)){
$this->Redirect('/pages/home');
}else{
$this->Session->setFlash('incorrect');
}
}
}
function logout(){
$this->redirect($this->Auth->logout());
}
Now its allowing logging in irrespective of the the employee code or password entered. In fact its alloing logging in even if login fields are empty.
Try the following:
echo $this->Form->create('Employee', array('controller' => 'employees', 'action' => 'login'));
And also check the user authenticity in login method of your EmployeesController.php
public function login()
{
if ($this->request->is('post'))
{
if ($this->Auth->login($this->request->data))
{
/*... do what you want...*/
}
else
{
this->Session->setFlash('Your username or password was incorrect.');
}
}
}
echo $this->Form->create('Employee',array('/employees/login'));
Try:
echo $this->Form->create('Employee',array('action'=>'login'));
I had similar issue . Finally here is the solution.
a) Define the tablename and fileds inside $components. Dont use before filter
public $components = array('Session', 'Acl', 'Auth' => array('authenticate' => array('Form' => array('userModel' => 'Employee','fields' => array('username' => 'code'), 'password' => 'password'))), 'Cookie');
b)Never use
$this->Auth->login($this->request->data)
this creates session for whatever garbage u post.
Instead use
$this->Auth->login()
c) Also hashing method for cakephp is not md5. You may want to remove that line.

Cannot login using email in cakephp, works good with username

I cannot login using email in CakePHP 2.1, when i try with username then its working perfectly good.
Below is the code
View : login.ctp
<?php
echo $this->Form->create();
echo $this->Form->input('email');
//echo $this->Form->input('username');
echo $this->Form->input('password');
echo $this->Form->end('Login');
?>
Controller : UsersController.php
<?php
public function login(){
if ($this->request->is('post')){
if ($this->Auth->login()){
$this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash(__('Invalid email and password'));
}
}
}
?>
Model : User.php
<?php
App::uses('AuthComponent', 'Controller/Component');
class User extends AppModel {
public function beforeSave(){
if (isset($this->data[$this->alias]['password'])){
$this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
}
return true;
}
}
?>
Database Structure : users table
id Auto_Increment
username
email
password
role
I dont know, why it is not accepting any email id for login but for username its working good.
Read this section of the CakePHP book.
Here is the example from that section, you'll need to configure the form authentication to use a different field for the username.
public $components = array(
'Auth' => array(
'authenticate' => array(
'Form' => array(
'fields' => array('username' => 'email')
)
)
)
);

print username when login

i use this controller to login and logout users, and i want to display welcome message and the login username with logout link the problem is when i try to login this message apear to me
Notice (8): Undefined variable: results [APP\views\users\login.ctp, line 4]
users_controller.php
<?php
# /controllers/users_controller.php
# please note that not all code is shown...
uses('sanitize');
class UsersController extends AppController {
var $name = 'Users';
// Include the Email Component so we can send some out :)
var $components = array('Email','Auth','Recaptcha');
var $helpers = array('Recaptcha');
// Allow users to access the following action when not logged in
function beforeFilter () {
$this->Auth->allow('register','activate','logout','login');
$this->Auth->autoRedirect = false;
}
function login() {
// Check for incoming login request.
if ($this->data) {
// Use the AuthComponent's login action
if ($this->Auth->login($this->data)) {
// Retrieve user data
$results = $this->User->find(array('User.username' => $this->data['User']['username']), array('User.active'), null, false);
// Check to see if the User's account isn't active
if ($results['User']['active'] == 0) {
// Uh Oh!
$this->Session->setFlash('Your account has not been activated yet!');
$this->Auth->logout();
$this->data['User']['password'] = null;
//if not active user
}else {
$this->set('users', $results);
$this->redirect(array('controller' => 'users', 'action' => 'login'));
}
}
}
}
function logout() {
$this->redirect($this->Auth->logout());
}
users/login.ctp
<?php if ($this->Session->read('Auth.User')):?>
<?php
echo "Welcome".'<br />' ;
echo $results;
echo $html->link('logout', array('action'=>'logout'));
?>
<?php else : ?>
<div class="types form">
<?php echo $form->create('User');?>
<fieldset>
<legend><?php echo ('Please enter your username and password'); ?></legend>
<?php
echo $form->input('username');
echo $form->input('password');
?>
</fieldset>
<?php echo $form->end(('Login'));?>
</div>
<?php endif; ?>
You have to pass the data from your controller to the view by using the set method: $this->set('results', $results);. See also http://book.cakephp.org/view/977/Controller-Methods#Interacting-with-Views-978
AppController.php
function beforeFilter(){
$this->set('username', $this->_usersUsername());
}
function _usersUsername(){
$users_username = NULL;
if($this->Auth->user()){
$users_username = $this->Auth->user('username');
}
return $users_username;
}
view.ctp
<?php if(isset($username)) :?>
hello <?php echo $username; ?>! Welcome back.
<?php endif; ?>

Resources