Laravel 验证码认证学习记录小结


Posted in PHP onDecember 20, 2019

注:此处所用的注册等系列功能,均作用于 laravel 自带的用户认证机制

注册验证码

1. composer 安装验证码

composer require "mews/captcha:~3.0"

2. 运行以下命令生成配置文件 config/captcha.php

php artisan vendor:publish --provider='Mews.aptcha.aptchaServiceProvider'

3. 前端展示验证码

<img class="thumbnail captcha mt-3 mb-2" src="{{ captcha_src('flat') }}" onclick="this.src='/captcha/flat?'+Math.random()" title="点击图片重新获取验证码">

4. 后端验证(该扩展包是为 Laravel 定制的扩展包,完全兼容 laravel 注册功能,验证非常方便)只需要在 app/Http/Controllers/Auth/RegisterController.php 中的验证规则中加入如下代码:

'captcha' => ['required', 'captcha'],

邮箱认证

laravel 自带邮箱认证

laravel 自带的邮箱认证文件位于 vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php ,因为此文件采用 trait 声明,因此我们快速的将内容通过 use 集成到用户的模型中,并进行调用,如下:

namespace App\Models;
  use Illuminate\Foundation\Auth\User as Authenticatable;
  use Illuminate\Notifications\Notifiable;
  use Illuminate\Auth\MustVerifyEmail as MustVerifyEmailTrait;
  class User extends Authenticatable {
    use Notifiable, MustVerifyEmailTrait;

为了代码的规范,我们可以接入 larave 自带的邮箱验证接口 Illuminate\Contracts\Auth\MustVerifyEmail,规定模型必须拥有相关的方法,具体方法如下(方法在 MustVerifyEmailTrait 中已经定义好,直接调用既可):

  • hasVerifiedEmail() 检测用户 Email 是否已认证;
  • markEmailAsVerified() 将用户标示为已认证;
  • sendEmailVerificationNotification() 发送 Email 认证的消息通知,触发邮件的发送;
  • getEmailForVerification() 获取发送邮件地址,提供这个接口允许你自定义邮箱字段。

发送邮件

我们使用了 Laravel 自带的 RegisterController ,控制器通过加载 Illuminate.oundation.uth.egistersUsers trait 来引入框架的注册功能,此时我们打开此 trait 来翻阅源码并定位到 register(Request $request) 方法:

public function register(Request $request) { 
// 检验用户提交的数据是否有误 
$this->validator($request->all())->validate(); 
// 创建用户同时触发用户注册成功的事件,并将用户传参 
event(new Registered($user = $this->create($request->all()))); 
// 登录用户 
$this->guard()->login($user); 
// 调用钩子方法`registered()`
return $this->registered($request, $user) ?: redirect($this->redirectPath()); 
}

此方法处理了用户提交表单后的逻辑,我们把重点放在 event(new Registered($user = $this->create($request->all())));,这里使用了 Laravel 的事件系统,触发了 Registered 事件。

打开 app/Providers/EventServiceProvider.php 文件,此文件的 $listen 属性里我们可以看到注册了 Registered 事件的监听器:

protected $listen = [ 
  Registered::class => [ SendEmailVerificationNotification::class, ], 
];

打开 SendEmailVerificationNotification 类,阅读其源码:vendor/laravel/framework/src/Illuminate/Auth/Listeners/SendEmailVerificationNotification.php

<?php 
namespace Illuminate\Auth\Listeners;

use Illuminate\Auth\Events\Registered;
use Illuminate\Contracts\Auth\MustVerifyEmail;

class SendEmailVerificationNotification
{
  /**
   * 处理事件
   *
   * @param \Illuminate\Auth\Events\Registered $event
   * @return void
   */
  public function handle(Registered $event)
  {
    // 如果 user 是继承于 MustVerifyEmail 并且还未激活的话
    if ($event->user instanceof MustVerifyEmail && ! $event->user->hasVerifiedEmail()) {
      // 发送邮件认证消息通知(认证邮件)
      $event->user->sendEmailVerificationNotification();
    }
  }
}

可以看出 Laravel 默认已经为我们设置了邮件发送的逻辑,接下来我们来测试一下。

测试邮件

测试之前,我们先设置下邮件发送到 log 中,以便后面的测试:

修改环境设置文件.env

MAIL_DRIVER=log

邮件一般发在 storage/logs 目录下的日志文件中

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php 遍历数据表数据并列表横向排列的代码
Sep 05 PHP
PHP计划任务之关闭浏览器后仍然继续执行的函数
Jul 22 PHP
PHP zip扩展Linux下安装过程分享
May 05 PHP
php实现数组中索引关联数据转换成json对象的方法
Jul 08 PHP
CodeIgniter多语言实现方法详解
Jan 20 PHP
php生成图片验证码的方法
Apr 15 PHP
py文件转exe时包含paramiko模块出错解决方法
Aug 12 PHP
PHP magento后台无法登录问题解决方法
Nov 24 PHP
Laravel实现表单提交
May 07 PHP
php校验公钥是否可用的实例方法
Sep 17 PHP
laravel 5.5 关闭token的3种实现方式
Oct 24 PHP
PHP mkdir创建文件夹实现方法解析
Nov 13 PHP
php文件上传原理与实现方法详解
Dec 20 #PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 #PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 #PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 #PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 #PHP
Laravel框架处理用户的请求操作详解
Dec 20 #PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 #PHP
You might like
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
JavaScript 空位补零实现代码
2010/02/26 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
2013/05/27 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
js实现分页功能
2017/05/24 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
webpack项目轻松混用css module的方法
2018/06/12 Javascript
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
5种Python单例模式的实现方式
2016/01/14 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
python中异常捕获方法详解
2017/03/03 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
从DataFrame中提取出Series或DataFrame对象的方法
2018/11/10 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
基于python判断字符串括号是否闭合{}[]()
2020/09/21 Python
python字典与json转换的方法总结
2020/12/28 Python
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
有模特经验的简历自我评价
2013/09/19 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
求职简历自我评价范例
2014/03/12 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
鼋头渚导游词
2015/02/05 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
预备党员考察意见范文
2015/06/01 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
MySQL性能压力基准测试工具sysbench的使用简介
2021/04/21 MySQL
js 实现验证码输入框示例详解
2022/09/23 Javascript