/**
     * 重置密码页,验证链接有效性,页面发送邮件调用sendResetPwdEmail()方法
     */
    public function resetPwd()
    {
        $param = input('');
        $bool  = $this->verifyUrl($param);
        if ($bool) {
            $this->assign("param", $param);
            return $this->fetch('resetpwd');
        } else {
            abort(404, '链接失效或错误');
        }
    }

    /**
     * 执行重置密码
     */
    public function doResetPwd()
    {
        $param = input('param.');     // 验证链接有效性
        $bool  = $this->verifyUrl($param);
        if ($bool) {
            $validateRes = is_pwd($param['password']);
            if (!$validateRes) {
                return info(lang("密码必须包含大小写字母,数字,长度为8~16"), 0);
            }
            if ($param['password'] != $param['rpassword']) {
                return info('两次密码输入不一致', 1);
            } else {
                $c = explode('+', base64_decode($param['c']));
                try {
                    model('User')->where(['email' => $c[0]])->update(['password' => mduser($param['password'])]);
                    return info('密码重置成功');
                } catch (Exception $e) {
                    return info('密码重置失败,请联系管理员');
                }
            }
        } else {
            abort(404, '链接失效或错误');
        }
    }

    /**
     * 重置密码发送邮箱
     */
    public function sendResetPwdEmail()
    {
        $param = input('post.email');
        if (empty($param)) {
            return false;
        }
        $data = model('user')->getRow(['email' => $param], 'id,it_code,password');
        if (empty($data)) {
            return info('邮箱未注册', 0);
        }

        $time = time();
        $key1 = base64_encode($param . '+' . $time);
        $key2 = md5($data['id'] . $data['it_code'] . $data['password'] . $time . config('user_auth_key'));
        $url  = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . url('/resetPwd', ['c' => $key1, 'k' => $key2]);
        $body = "<b>" . $data['it_code'] . ',您好:</b></br></br></n>'
            . '&nbsp;&nbsp;感谢您使用门户平台!</br></br>'
            . '&nbsp;&nbsp;请<a href="' . $url . '">点击这里重置密码</a>。';

        $receiver = array($param);     // 发送邮件方法另见下一篇文章
        $res      = send_mail($receiver, '门户平台密码重置', $body);

        if ($res) {
            return info('邮件发送成功,请查收邮件', 1);
        } else {
            return info('邮件发送失败,请联系管理员', 0);
        }
    }

    /**
     * 验证链接有效性
     */
    private function verifyUrl($param)
    {
        if (empty($param['c']) || empty($param['k'])) {
            return false;
        }
        $c = explode('+', base64_decode($param['c']));
        if (count($c) != 2) {
            return false;
        }     // 用户数据不存在 页面失效
        $userData = model('user')->getRow(['email' => $c[0]], 'id,it_code,password');
        if (empty($userData)) {
            return false;
        }     // 密码重置后 页面失效
        $key = md5($userData['id'] . $userData['it_code'] . $userData['password'] . $c[1] . config('user_auth_key'));
        if ($key != $param['k']) {
            return false;
        }     // 时间过1800s 页面失效
        if ($c[1] + 1800 < time()) {
            return false;
        }
        return true;
    }

php发送邮箱重置密码链接,并在重置成功后使链接失效 (ThinkPHP5)的更多相关文章

  1. AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码

    AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . AspNetCore - MVC实战系列(一)之Sqlserver表映射实体模型 . AspNetCore-MVC实战系列(二)之 ...

  2. Microsoft.AspNet.Identity 重置密码

    重置密码:先生成重置密码的Token,然后调用ResetPassword方法重置密码,密码要符合规则.. ApplicationUserManager UserManager => _userM ...

  3. Java实现发送邮箱验证码/注册验证链接

    本文以163邮箱为例 1.准备(邮箱账号,邮箱必须设置POP3/SMTP/IMAP,设置步骤如下:) >>步骤:1 开启授权码服务 >>步骤:2 手机获取验证码 >> ...

  4. wordpress新注册用户或重置密码链接失效

    在网上找了好多个博客,一个比一个不要脸,要更改的是两个文件,最后都抄成一个文件了. 原文链接https://www.cnblogs.com/liudecai/p/6474611.html 我是按照这个 ...

  5. Java实现邮箱找回密码 --转载

    通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...

  6. Java实现邮箱找回密码

    通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...

  7. python发送邮箱

    一.Python发送邮件 import smtplib from email.mime.text import MIMEText def send(email_to,title,content): m ...

  8. [py][mx]django通过邮箱找回密码

    忘记密码处理流程 注意: 这个文章里的找回密码页面截取有问题. 找回密码页应该是让输入邮箱 直接上代码 class ActiveView(View): # 主要功能是修改user_profile里的i ...

  9. django用户认证系统——重置密码7

    当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...

随机推荐

  1. Django 多数据库支持

    很多时候,需要去其他数据库查询数据,都将会面临多数据库支持问题. 1.在settings文件内添加多数据库连接 DATABASES = { 'default': { 'ENGINE': 'django ...

  2. C# - 设计模式 - 策略模式

    策略模式 问题场景 多个类型都有一些共同的属性和方法,可以称这些成员为行为,为了避免重复在多个类型中编码相同部分的行为,应考虑将这些行为定义在抽象类(超类)中,利用继承时多个类型可以共享这些行为.比如 ...

  3. LeetCode第十二题-将数字转化为罗马数字

    Integer to Roman 问题简介:将输入的int类型数字转化为罗马数字 问题详解:罗马数字由七个不同的符号表示:I,V,X,L,C,D和M 符号-数值 I - 1 V - 5 X -10 L ...

  4. POJ 3190

    POJ3190                               摊位预订.时间限制:1000MS内存限制:65536K.共提交材料:12959份接受:4 546名特别法官.描述. 哦,那些 ...

  5. 抓包工具tcpdump用法说明

    tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上. 不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才会停止抓包. 例如: ...

  6. 使用pytesseract出现的问题

    dyld: Library not loaded: /usr/local/opt/jpeg/lib/libjpeg.8.dylib Referenced from: /usr/local/lib/li ...

  7. PowerDesigner的Table视图同时显示Code和Name的方法[转发]

    PowerDesigner中Table视图同时显示Code和Name,像下图这样的效果: 实现方法:Tools-Display Preference

  8. rsyslog磁盘辅助(Disk-Assisted)模式踩坑记

    最近公司为方便tracing.排查, 搞全链路日志收集,而我手上的10亿+pv的动态前端服务必然在考虑之列. 之前呢. 都是运维定制的收集方式: 如上图,rsyslog push kafka, 优点嘛 ...

  9. C/C++的20个位运算技巧

    一提起位运算,人们往往想到它的高效性,无论是嵌入式编程还是优化系统的核心代码,适当的运用位运算总是一种迷人的手段,或者当您求职的时候,在代码中写入适当的位运算也会让您的程序增加一丝亮点,最初当我读&l ...

  10. Windows Internals 笔记——线程

    1.进程有两个组成部分,一个进程内核对象和一个地址空间.线程也有两个组成部分: 一个是线程的内核对象,操作系统用它管理线程.系统还用内核对象来存放线程统计信息的地方. 一个线程栈,用于维护线程执行时所 ...