Hello Reader's!,If you want to add forgot password field in your login page and send the forgot password link through mail Then I wrote this blog for you.
// first create a forgot password link in your login page and allow forgot password page access before login
<?php echo $this->Html->link('Forgot Password',array('controller'=>'Users','action'=>'forgetpwd'));?>
// Gives the page access in controller before doing Anywork
 
parent::beforeFilter();
$this->Auth->allow('forgetpwd','reset');
// create forgotpwd.ctp in /view/Users/forgotpwd.ctp
<div class="forgetpwd form" style="margin:5px auto 5px auto;width:450px;">
<?php echo $this->Form->create('User', array('action' => 'forgetpwd')); ?>
<?php echo $this->Form->input('email',array('style'=>'float:left'));?>
<input type="submit" class="button" style="float:left;margin-left:3px;" value="Recover" />
<?php echo $this->Form->end();?>
</div>
//set the smtp setting for sending email  in config/email.php copy below code as default
public $default = array(
		'transport' => 'Smtp',
		'from' => array('noreply@ishake.com' => 'Login Reset'),
		'host' => 'ssl://smtp.gmail.com',
		'port' => 465,
		'timeout' => 30,
		'username' => 'gmail_id',
		'password' => 'Password',
		'client' => null,
		'log' => false,
		'emailFormat' => 'html',
		'charset' => 'utf-8',
		'headerCharset' => 'utf-8',
	);
//App Controller Function for set the mail in appcontroller
 public function send_mail($email_data = null)
    {
        $email         = new CakeEmail('default');
        $email_to      = $email_data['to'];
        $email_msg     = $email_data['body'];
        $email_subject = $email_data['subject'];
        
        $email->to($email_to);
        $email->subject($email_subject);
        $mail_status = @$email->send($email_msg);
     
        if (!$mail_status) {
            return FALSE;
        }
        return TRUE;
    }
 
//Add Tokenhash field in user table 
 
//create the function which create the token for user and save it in user table for varification user email id	
public function forgetpwd()
{
		$this->User->recursive=-1;
		if(!empty($this->data))
		{
			if(empty($this->data['User']['email']))
			{
				$this->Session->setFlash('Please Provide Your Email Adress that You used to Register with Us');
			}
			else
			{
				$email=$this->data['User']['email'];
				$fu = $this->User->find('first', array('conditions' => array('User.email' => $email)));
										
				if($fu)
				{
					
					if($fu['User']['user_status']=='1')
					{
						$key = Security::hash(CakeText::uuid(),'sha512',true);
						$hash=sha1($fu['User']['username'].rand(0,100));
						$url = Router::url( array('controller'=>'Users','action'=>'reset'), true ).'/'.$key.'#'.$hash;
						$ms=$url;
						
						
						
						$ms=wordwrap($ms,1000);
						
						$fu['User']['tokenhash']=$key;
						$this->User->id=$fu['User']['id'];
				
						
						if($this->User->saveField('tokenhash',$fu['User']['tokenhash']))
						{						
						
						$this->set('ms', $ms);	
																		
						$data = array();
						
						$data['to'] = $fu['User']['email'];
						$data['subject'] = 'Reset Password';
						$data['body'] =$ms;
						$output =$this->send_mail($data); 
//This is a function in appcontroller which send the mail to registerd user (see below this function)
							if($output){
								$this->Session->setFlash('Check Your Mail Id for Reset Your password');
								$this->redirect(array('controller'=>'users','action'=>'login'));
							}																								
						}
						else{
							$this->Session->setFlash("Error Generating Reset link");
						}
					}
					else
					{
						$this->Session->setFlash('This Account is not Active yet.Check Your mail to activate it');
					}
				}
				else
				{
					$this->Session->setFlash('Email does Not Exist');
				}
			}
		}	
}
 
//now create Reset Password Code which get user token and validate befor updation 
public function reset($token=null)
{
			
		$this->User->recursive=-1;
		if(!empty($token))
		{
			$u=$this->User->findBytokenhash($token);
			if(!empty($u))
			{
				$this->User->id=$u['User']['id'];		
				
				if(!empty($this->data))
				{	 
					$this->User->data=$this->data;
					$this->User->data['User']['username']=$u['User']['username'];
					$new_hash=sha1($u['User']['username'].rand(0,100));//created token
						
					$this->User->data['User']['tokenhash']=$new_hash;
					
					if($this->User->validates(array('fieldList' => array('password', 'password_confirm'))))
					{
																						
						if($this->User->save($this->User->data))
						{
							$this->Session->setFlash('Password Has been Updated');
							$this->redirect(array('controller'=>'users','action'=>'login'));
						}
					}
					else{
						$this->set('errors',$this->User->invalidFields());
						}
				}
			}
			else
			{
				$this->Session->setFlash('Token Corrupted,,Please Retry.the reset link work only for once.');
			}
		}
		else
		{
			$this->Session->setFlash('Invalid Token,Try Again');
			$this->redirect(array('controller'=>'users','action'=>'login'));
		}
	
}
 
 
Hope this will be helpful for you!!! Contact me if there is any problem:)
 
                       
                    
3 Comment(s)