2014-09-29 3 views
0

Я только начал использовать CakePHP и люблю его использовать! Я создал систему входа в систему и систему регистрации, однако я действительно борюсь с разделом «забытый пароль».CakePHP 2.4 Забытый пароль

Я хочу использовать tokenhash и дату истечения срока действия в БД пользователей, так что не может злоупотреблять, пользователям должны ввести имя пользователя и адрес электронной почты, чтобы получить ссылку активации по электронной почте к ним вновь образовавшеесу tokenhash

Там довольно много учебников, но я считаю, что большинство из них работают для первой части, например отправка по электронной почте ссылки активации/сброса токена и таймера, но все, похоже, не работают при смене пароля.

Пожалуйста, помогите мне, либо с помощью рабочего учебника из сети, либо с помощью решения, которое применяет вышеуказанные необходимые вещи.

Заранее спасибо Steve

+1

HTTP : //github.com/cakedc/users использовать его или посмотреть на код, если вы хотите сделать это самостоятельно. Плагин покрывает то, что вы хотите. – burzum

ответ

2

Ниже я пишу код, который я написал для одного из моих проектов, это может помочь вам.

1- Я создал новую таблицу, которая содержит уникальный токен для каждого пользователя.

Название таблицы: - user_password_resets

Колонны: userclient_id, Token

2- Адрес электронной почты: Имя шаблона, как: - change_password.html внутри /webroot/template/change_password.html

public function login_send() { 
     $this->isLoggedIn(); //Check if the user is logged in 
     if($this->request->is('post')) { #if the form is submitted 
     $login = $this->data['User']['login']; 
     $conditions = array('User.login'=>$login); 
     if($this->User->hasAny($conditions)) { 
      $users = $this->User->find('first', array('conditions'=>$conditions)); 
      #Generate the token 
      $token = md5(uniqid(rand(),true)); 
      #Save token and other details in user_password_reset_links table 
      $users = $this->User->find('first', array('conditions'=>array('User.login'=>$login))); 
      $my_name = $users['User']['first_name']; 
      $reset_links = array(); 
      $reset_links['UserPasswordReset']['userclient_id'] = $users['User']['client_id']; 
      $reset_links['UserPasswordReset']['token'] = $token; 

      $conditions = array('UserPasswordReset.userclient_id'=>$users['User']['client_id']); 
      if($this->UserPasswordReset->hasAny($conditions)) { 
       $user_id = $users['User']['client_id']; 
       $this->UserPasswordReset->updateAll(array('UserPasswordReset.token'=>"'$token'"), array("UserPasswordReset.userclient_id"=>"$user_id"));  
      } else { 
       $this->UserPasswordReset->create(); 
       $this->UserPasswordReset->save($reset_links); 
      } 
      $password_reset_link = BASE_URL."users/reset_password/$token"; 

      #Send Welcome Email 
      $mailContent = file_get_contents(BASE_URL . "templates/change_password.html"); 
      $rootlink = BASE_URL; 
      $arrMail = array(
       "{NICK}" => ucfirst($my_name), 
       "{rootlink}" => BASE_URL, 
       "{SITE_TITLE}" => SITE_TITLE, 
       "{PASSWORD_RESET_LINK}"=>$password_reset_link 
       ); 

      $mails = explode(',', $users['User']['email']);  
      $msg = @str_replace(array_keys($arrMail), array_values($arrMail), $mailContent); 
      $data = array(); 
      $data['to'] = @$mails[0]; 
      $data['body'] = $msg; 
      $data['subject'] = SITE_TITLE.'- Reset Password.'; 
      $this->send_mail($data); 

      $this->Session->setFlash('A password reset link has been sent to the email address.', 'default', array('class'=>'successMsg')); 
      $this->redirect(array('controller'=>'users', 'action'=>'login')); 
      exit; 
     } else { 
      $this->Session->setFlash('The Username entered is not registered with Captain Marketing.', 'default', array('class'=>'errorMsg')); 
      $this->redirect(array('controller'=>'users', 'action'=>'login_send')); 
      exit; 
     } 
    } 
    $this->set('title_for_layout', '-Send password reset link'); 
    } 
+0

Привет, Dinesh, мне нравится этот скрипт, как выглядит ваш просмотр/функция просмотра reset_password? это основной бит, с которым я борюсь, мне нравится, как вы это сделали, но –

+0

Я генерирую уникальный токен, сохраняя его вместе с user_id в новой таблице, отправляя клиенту токена сброса пароля клиенту. Клиент, когда нажимает на токен сброса пароля и пользователи приходит на мой сайт, я проверяю дату создания токена, если он не истек, новый пароль сохраняется, иначе пользователь получит уведомление о том, что токен истек. попробуйте еще раз –

+0

ah ok да, что извините, я не читал код правильно :) Я проверю это, как только смогу. спасибо –

Смежные вопросы