To implement 'Remember Me' functionality in cakephp, you need to follow following steps.
Step1 : Add the following code in app/Config/core.php
Configure::write('Session', array(
'defaults' => 'php'
'defaults' => 'php',
'cookieTimeout' => 0
));
Step2 : Add the following code in app/Controller/AppController.php
public function beforeFilter() {
$this->Auth->allow('login', 'logout','forgot','register','getCities','getStates','getData');
$this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'home');
$this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'logout', 'login');
// $this->Auth->authorize = array('Controller');
$this->Auth->redirectUrl(array('controller' => 'users', 'action' => 'home'));
$this->Auth->authenticate = array(
'Cookie' => array(
'fields' => array(
'username' => 'email',
'password' => 'password'
),
'userModel' => 'User',
),
'Form' =>array(
'passwordHasher' => 'Blowfish',
'fields' => array('username' => 'email')
),
);
$this->Cookie->type('rijndael');
$this->set('authUser', $this->Auth->user());
@$cookieData = $this->Cookie->read('User');
// echo debug($cookieData);
if (!empty(@$cookieData))
{
$this->request->data["User"]["email"] = $cookieData["User"]["email"];
$this->request->data["User"]["password"] = $cookieData["User"]["password"];
}
}
Step3 : Add the following code in app/Controller/Component/Auth/CookieAuthenticate.php
<?php
App::uses('BaseAuthenticate', 'Controller/Component/Auth');
App::uses('AuthComponent', 'Controller/Component');
App::uses('Router', 'Routing');
/**
* An authentication adapter for AuthComponent. Provides the ability to authenticate using COOKIE
*
* {{{
* $this->Auth->authenticate = array(
* 'Authenticate.Cookie' => array(
* 'fields' => array(
* 'username' => 'username',
* 'password' => 'password'
* ),
* 'userModel' => 'User',
* 'scope' => array('User.active' => 1),
* 'crypt' => 'rijndael', // Defaults to rijndael(safest), optionally set to 'cipher' if required
* 'cookie' => array(
* 'name' => 'RememberMe',
* 'time' => '+2 weeks',
* )
* )
* )
* }}}
*
*/
class CookieAuthenticate extends BaseAuthenticate {
public function __construct(ComponentCollection $collection, $settings) {
$this->settings['cookie'] = array(
'name' => 'RememberMe',
'time' => '+2 weeks',
'base' => Router::getRequest()->base
);
$this->settings['crypt'] = 'rijndael';
parent::__construct($collection, $settings);
}
/**
* Authenticates the identity contained in the cookie. Will use the `settings.userModel`, and `settings.fields`
* to find COOKIE data that is used to find a matching record in the `settings.userModel`. Will return false if
* there is no cookie data, either username or password is missing, of if the scope conditions have not been met.
*
* @param CakeRequest $request The unused request object
* @return mixed False on login failure. An array of User data on success.
* @throws CakeException
*/
public function getUser(CakeRequest $request) {
if (!isset($this->_Collection->Cookie) || !$this->_Collection->Cookie instanceof CookieComponent) {
throw new CakeException('CookieComponent is not loaded');
}
$this->_Collection->Cookie->type($this->settings['crypt']);
list(, $model) = pluginSplit($this->settings['userModel']);
$data = $this->_Collection->Cookie->read($model);
if (empty($data)) {
return false;
}
extract($this->settings['fields']);
if (empty($data[$username]) || empty($data[$password])) {
return false;
}
$user = $this->_findUser($data[$username], $data[$password]);
if ($user) {
$this->_Collection->Session->write(AuthComponent::$sessionKey, $user);
return $user;
}
return false;
}
public function authenticate(CakeRequest $request, CakeResponse $response) {
return $this->getUser($request);
}
public function logout($user) {
$this->_Collection->Cookie->destroy();
}
}
Step4 : Add the following code in app/Controller/UsersController.php
public function login()
{
if($this->Auth->user()){
$this->redirect(array('controller'=>'Users','action'=>'home'));
}
if ($this->request->is('post')) {
if ($this->Auth->login()) {
$this->_setCookie($this->Auth->user('id'));
$this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash(' Invalid username or password ');
}
}
if ($this->Auth->loggedIn() || $this->Auth->login()) {
return $this->redirect($this->Auth->redirectUrl());
}
}
protected function _setCookie($id) {
if (!$this->request->data['remember_me']) {
return false;
}
$data = array(
'User' => array(
'email' => $this->request->data['User']['email'],
'password' => $this->request->data['User']['password']
));
$this->Cookie->write('User', $data, true, '+2 week');
return true;
}
Step5 : Add the following code in app/View/Users/login.ctp
<?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');
?>
<?php
echo $this->Form->input('username');
echo $this->Form->input('password');
echo $this->Form->checkbox('remember_me');
?>
</fieldset>
<?php echo $this->Form->end(__('Login')); ?>
</div>
0 Comment(s)