cakephp 2.0 中的忘记密码功能

Posted

技术标签:

【中文标题】cakephp 2.0 中的忘记密码功能【英文标题】:forgot password function in cakephp 2.0 【发布时间】:2013-12-01 06:04:18 【问题描述】:

我在编程和 php 方面非常新。我正在寻找使用 CakePHP 创建一个简单的忘记密码系统,用户将在其中输入他们的用户名/电子邮件,然后收到一封电子邮件,其中包含他们可以单击以创建新的链接的链接密码。

我用谷歌搜索过,但没有找到任何东西:/

有没有人可以帮助我或者给我一个 cakephp 简单教程的链接,用于忘记或重置密码?

【问题讨论】:

你使用的是哪个 cakephp 版本? @Aladdin cakephp 2.xx github.com/chetanvarshney/… 【参考方案1】:

更新

在用户表中添加resetkey字段。

UserModel 中创建 beforeSave 操作并在该操作中添加这一行

public function beforeSave($options = array()) 
            parent::beforeSave($options = array());
            if (isset($this->data['User']['password'])) 
                $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
            
            $this->data['User']['resetkey'] = Security::hash(mt_rand(),'md5',true);
            return true;
        

当用户申请忘记密码时,将此resetkey发送到他的邮箱。 一些控制器 这是忘记操作的提示

if($this->request->is('post')) 
    $this->loadModel('User');
    $mail = $this->request->data['User']['mail'];
    $data = $this->User->findByMail($mail);
    $key = $data['User']['resetkey'];
    if(!$data) 
        $message = __('No Such E-mail address registerd with us ');
        $this->Session->setFlash($message,'flash',array('alert'=>'error'));
     else 
        $key = $data['User']['resetkey'];
        $id = $data['User']['id'];
        $mail = $data['User']['email'];
        $email = new CakeEmail('smtp');
        $email->to($mail);
        $email->from("service@localhost.com");
        $email->emailFormat('html');
        $email->subject('Password reset instructions from');
        $email->viewVars(array('key'=>$key,'id'=>$id,'rand'=> mt_rand()));
        $email->template('reset');
        if($email->send('reset')) 
        $message = __('Please check your email for reset instructions.');
        $this->Session->setFlash($message,'flash',array('alert'=>'success'));
         else 
            $message = __('Something went wrong with activation mail. Please try later.');
        $this->Session->setFlash($message,'flash',array('alert'=>'error'));
        
    
    $this->redirect('/');

将该重置密钥发送给用户,以便当用户更改密码时,Auth 将调用 beforSave 保存操作并更新重置密钥。所以没有人可以使用相同的密钥访问其余密码页面。电子邮件模板

App/View/Emails/reset.ctp

<p>Please click on the link below to reset your password.</p>
<a href="http://<?= $_SERVER['HTTP_HOST']; ?>/reset/<?= $key .'BXX'.$rand.'XXB'. $id ?>/">Click here to reset your account password</a>
<hr />
<p>Alternatively, you can also copy paste the below link into your browser:
</p>
<p>http://<?= $_SERVER['HTTP_HOST']; ?>/reset/<?= $key .'BXX'.$rand.'XXB'. $id ?>/</p>
<p>This email was sent by <?= APPNAME ?>.</p>

您可以在App/Config/bootstrap.php中定义APPNAME,添加如下代码

define('APPNAME','FooBar');这是重置操作的提示

$this->loadModel('User');
$a = func_get_args();
$keyPair = $a[0];
$key = explode('BXX', $keyPair);
$pair = explode('XXB',$key[1]);
$key = $key[0];
$pair = $pair[1];
$password = $this->request->data['User']['password'];
unset($this->request->data['User']['password']);
$uArr = $this->User->findById($pair);
if($uArr['User']['resetkey'] == $key) 
$this->User->read(null, $pair);
$this->User->set('password', $password);
if($this->User->save())  
$message = __('Your password has been reset');
$this->Session->setFlash($message,'flash',array('alert'=>'success')); 
 else 
$message = __('Something has gone wrong. Please try later or <b>sign up again</b>');
$this->Session->setFlash($message,'flash',array('alert'=>'alert')); 
 else 
$message = __('<b>Please check your reset link</b>');
$this->Session->setFlash($message, 'flash', array('alert'=> 'error'));
   

在溃败中

Router::connect('/reset/*',array('controller'=&gt;'Home','action'=&gt;'reset')); 您的忘记密码功能已准备就绪

【讨论】:

我忘了给你resetpassword页面的例子Router::connect('/reset/*',array('controller'=&gt;'User','action'=&gt;'reset')); 查看更新后的答案 我不太确定“App/Config/bootstrap.php”..reset 操作..和 'Router::connect('/reset/*',array('controller'=> 'Home','action'=>'reset')); ' 应该把这个放在哪里? Router::connect('/reset/*',array('controller'=&gt;'Home','action'=&gt;'reset')); 总是进入 routs.php routs.php 在什么文件夹里??【参考方案2】:

我认为这是我发现的更容易并且有效的方法!

http://www.stumbleupon.com/su/34E99D#

【讨论】:

真的不能有一个外部链接来回答..什么保证该链接将来会起作用..

以上是关于cakephp 2.0 中的忘记密码功能的主要内容,如果未能解决你的问题,请参考以下文章

忘记密码过程的最佳做法是啥?

设计 - “忘记密码”功能 - 不接受用户名和密码

三步而不是四步忘记密码功能

忘记密码:实现忘记密码功能的最佳方法是什么?

laravel5.5 自带的忘记密码邮箱找回功能小记

忘记密码功能 Spring(密码检索)