zoukankan      html  css  js  c++  java
  • yii2邮箱修改密码

    配置:web.php

    'mailer' => [
                'class' => 'yiiswiftmailerMailer',
                // send all mails to a file by default. You have to set
                // 'useFileTransport' to false and configure a transport
                // for the mailer to send real emails.
                'useFileTransport' => false,
                'transport' => [
                    'class' => 'Swift_SmtpTransport',
                    'host' => 'smtp.qq.com',
                    'username' => 'maoriaty@foxmail.com',
                    'password' => '*********', //授权码
                    'port' => '465',
                    'encryption' => 'ssl',
                ],
            ],

    忘记密码:publicController.php

    // 忘记密码
        public function actionSeekpassword()
        {
            $this->layout = false;
            $model = new Admin;
            if (Yii::$app->request->isPost) {
                $post = Yii::$app->request->post();
                if ($model->seekPass($post)) {
                    Yii::$app->session->setFlash('info', '电子邮箱已经发送成功,请查收');
                }
            }
            return $this->render('seekpassword', ['model' => $model]);
        }

    找回密码:admin.php

    <?php
    namespace appmodulesmodels;
    
    use Yii;
    use yiidbActiveRecord;
    
    class Admin extends ActiveRecord
    {
        public $rememberMe = true;
        public $repass;
    
        public static function tableName()
        {
            return "{{%admin}}";
        }
    
        public function rules()
        {
            return [
                ['adminuser', 'required', 'message' => '管理员账号不能为空', 'on' => ['login', 'seekpass', 'changepass']],
                ['adminpass', 'required', 'message' => '管理员密码不能为空', 'on' => ['login', 'changepass']],
                ['rememberMe', 'boolean', 'on' => 'login'],
                ['adminpass', 'validatePass', 'on' => 'login'],
                ['adminemail', 'required', 'message' => '电子邮箱不能为空', 'on' => 'seekpass'],
                ['adminemail', 'email', 'message' => '电子邮箱格式不正确', 'on' => 'seekpass'],
                ['adminemail', 'validateEmail', 'on' => 'seekpass'],
                ['repass', 'required', 'message' => '确认密码不能为空', 'on' => 'changepass'],
                ['repass', 'compare', 'compareAttribute' => 'adminpass', 'message' => '两次密码输入不一致', 'on' => 'changepass']
            ];
        }
    
        public function validatePass()
        {
            if (!$this->hasErrors()) {
                $res = self::find()->where('adminuser = :user and adminpass = :pass', [':user' => $this->adminuser, ':pass' => md5($this->adminpass)])->one();
                if (is_null($res)) {
                    $this->addError('adminpass', '用户名或密码错误');
                }
            }
        }
    
        public function validateEmail()
        {
            if (!$this->hasErrors()) {
                $res = self::find()->where('adminuser = :user and adminemail = :email', [':user' => $this->adminuser, ':email' => $this->adminemail])->one();
                if (is_null($res)) {
                    $this->addError('adminemail', '管理员电子邮箱不匹配');
                }
            }
        }
    
        // 登陆
        public function login($data)
        {
            $this->scenario = 'login';
            if ($this->load($data) && $this->validate()) {
                // 存入session
                $lifetime = $this->rememberMe ? 24*3600 : 0; // 过期时间
                $session = Yii::$app->session;
                session_set_cookie_params($lifetime);
                $session['admin'] = [
                    'adminuser' => $this->adminuser,
                    'isLogin' => 1
                ];
                $this->updateAll(['logintime' => time(), 'loginip' => ip2long(Yii::$app->request->userIP)], 'adminuser = :user', [':user' => $this->adminuser]);
                return (bool)$session['admin']['isLogin'];
            }
            return false;
        }
    
        // 找回密码
        public function seekPass($data)
        {
            $this->scenario = 'seekpass';
            if ($this->load($data) && $this->validate()) {
                // 发送电子邮箱
                $time = time();
                $token = $this->createToken($data['Admin']['adminuser'], $time);
                $mailer = Yii::$app->mailer->compose('seekpass', ['adminuser' => $data['Admin']['adminuser'], 'time' => $time, 'token' => $token]);
                $mailer->setFrom("maoriaty@foxmail.com");
                $mailer->setTo($data['Admin']['adminemail']);
                $mailer->setSubject("测试商城-找回密码");
                if ($mailer->send()) {
                    return true;
                }
            }
            return false;
        }
    
        // 生成token
        public function createToken($adminuser, $time)
        {
            return md5(md5($adminuser).ase64_encode(Yii::$app->request->userIP).md5($time));
        }
    
        // 修改密码
        public function changePass($data)
        {
            $this->scenario = 'changepass';
            if ($this->load($data) && $this->validate()) {
                return (bool)$this->updateAll(['adminpass' => md5($this->adminpass)], 'adminuser = :user', [':user' => $this->adminuser]);
            }
            return false;
        }
    }

    发送内容:mail/seekpass.php

    <p>尊敬的<?=$adminuser ?>, 您好:</p>
    
    <p>您的找回密码链接如下:</p>
    
    <?php $url = Yii::$app->urlManager->createAbsoluteUrl(['admin/manage/mailchangepass', 'timestamp' => $time, 'adminuser' => $adminuser, 'token' => $token]);  ?>
    <p><a href="<?=$url?>"><?=$url?></a></p>
    
    <p>该链接5分钟内有效,请勿传递给别人!</p>
    
    <p>该邮件为系统自动发送,请勿回复!</p>

    修改密码:

    <?php
    namespace appmodulescontrollers;
    
    use Yii;
    use yiiwebController;
    use appmodulesmodelsAdmin;
    
    class ManageController extends Controller
    {
        public function actionMailchangepass()
        {
            $this->layout = false;
            $time = Yii::$app->request->get('timestamp');
            $adminuser = Yii::$app->request->get('adminuser');
            $token = Yii::$app->request->get('token');
            $model = new Admin;
            $myToken = $model->createToken($adminuser, $time);
            if ($token != $myToken) {
                $this->redirect(['public/login']);
                Yii::$app->end();
            }
            if (time()-$time > 300) {
                $this->redirect(['public/login']);
                Yii::$app->end();
            }
            if (Yii::$app->request->isPost) {
                $post = Yii::$app->request->post();
                if ($model->changePass($post)) {
                    Yii::$app->session->setFlash('info', '密码修改成功');
                }
            }
            $model->adminuser = $adminuser;
            return $this->render('mailchangepass', ['model' => $model]);
        }
    }

    视图:mailchangepass.php

    <?php $form = ActiveForm::begin([
                    'fieldConfig' => [
                        'template' => '{input}{error}'
                    ]
                ]); ?>
                    <div class="span4 box">
                        <div class="content-wrap">
                            <h6>商城 - 修改密码</h6>
                            <?php 
                                if (Yii::$app->session->hasFlash('info')) {
                                    echo Yii::$app->session->getFlash('info');
                                }
                            ?>
                            <?=$form->field($model, 'adminuser')->hiddenInput();?>
                            <?=$form->field($model, 'adminpass')->passwordInput(['class' => 'span12', 'placeholder' => '新密码'])?>
                            <?=$form->field($model, 'repass')->passwordInput(['class' => 'span12', 'placeholder' => '确认密码'])?>
                            <a href="<?=Url::to(['public/login']);?>" class="forgot">返回登陆</a>
    
                            <?=Html::submitButton('修改', ['class' => 'btn-glow primary login']);?>
                    </div>
                <?php ActiveForm::end(); ?>
  • 相关阅读:
    从业十余年谈谈对dotnet看法与坚持
    monodroid 调用 JNI Native 的一些问题
    application数据库连接池spring.datasource.type=com.alibaba.druid.pool.DruidDataSource报错
    IDEA创建Spring Boot项目无法连接http://start.spring.io 解决方法
    mysql安装和sqlyog,mysql缺少依赖
    idea配置本地maven
    idea2020v1.3设置中文
    java安装及javac报错解决方法
    微信小程序数组里的值修改,for循环修改数组内容
    微信小程序如何获取屏幕高度和宽度
  • 原文地址:https://www.cnblogs.com/maoriaty/p/9288863.html
Copyright © 2011-2022 走看看