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执行速度全攻略(上)
Oct 09 PHP
强烈推荐:php.ini中文版(1)
Oct 09 PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 PHP
php中session使用示例
Mar 29 PHP
destoon二次开发模板及调用语法汇总
Jun 21 PHP
Yii框架登录流程分析
Dec 03 PHP
thinkphp文件处理类Dir.class.php的用法分析
Dec 08 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
php 问卷调查结果统计
Oct 08 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
Apr 12 PHP
php中时间函数date及常用的时间计算
May 12 PHP
PHP折半(二分)查找算法实例分析
May 12 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
mysql建立外键
2006/11/25 PHP
PHP HTML代码串截取代码
2008/12/29 PHP
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
2012/07/31 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
jquery 的 $(&quot;#id&quot;).html() 无内容的解决方法
2010/06/07 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
2013/11/21 Javascript
浅谈javascript的调试
2015/01/28 Javascript
详解Javascript中的原型OOP
2016/10/12 Javascript
vue2中使用less简易教程
2018/03/27 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
Python读取一个目录下所有目录和文件的方法
2016/07/15 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
Python实现简单的语音识别系统
2017/12/13 Python
Python中正则表达式的用法总结
2019/02/22 Python
python networkx 包绘制复杂网络关系图的实现
2019/07/10 Python
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
学校大课间活动方案
2014/01/30 职场文书
会计求职信范文
2014/05/24 职场文书
单位委托书范本(3篇)
2014/09/18 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
班干部学习委员竞选稿
2015/11/20 职场文书
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
压缩Redis里的字符串大对象操作
2021/06/23 Redis