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 进度条实现代码
Mar 10 PHP
PHP 设置MySQL连接字符集的方法
Jan 02 PHP
关于尾递归的使用详解
May 02 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
PHP判断是否连接上网络的方法
Jul 01 PHP
Laravel5.1自定义500错误页面示例
Oct 09 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
Aug 17 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
thinkPHP中U方法加密传递参数功能示例
May 29 PHP
php中array_fill函数的实例用法
Mar 02 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
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
一个漂亮的php验证码类(分享)
2013/08/06 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
newxtree.js代码
2007/03/13 Javascript
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
2010/04/02 Javascript
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
2013/04/16 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
2017/02/13 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
2017/11/14 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
说说如何使用Vuex进行状态管理(小结)
2019/04/14 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
2019/09/25 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
Python中对元组和列表按条件进行排序的方法示例
2015/11/10 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
Python二维码生成识别实例详解
2019/07/16 Python
python MD5加密的示例
2020/10/19 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
CSS3 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
2014/09/02 HTML / CSS
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
工作迟到检讨书
2014/02/21 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
关于九一八事变的演讲稿2014
2014/09/17 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
法学专业求职信范文
2015/03/19 职场文书
pytorch 如何使用float64训练
2021/05/24 Python
python百行代码实现汉服圈图片爬取
2021/11/23 Python