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中通过ADODB库实现调用Access数据库之修正版本
Dec 31 PHP
php 各种应用乱码问题的解决方法
May 09 PHP
php从右向左/从左向右截取字符串的实现方法
Nov 28 PHP
使用Linux五年积累的一些经验技巧
Jun 20 PHP
PHP环境中Memcache的安装和使用
Nov 05 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
Nov 09 PHP
PHP数组编码gbk与utf8互相转换的两种方法
Sep 01 PHP
PHP中快速生成随机密码的几种方式
Apr 17 PHP
自制PHP框架之路由与控制器
May 07 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
Feb 15 PHP
TP5框架实现的数据库备份功能示例
Apr 05 PHP
TP5多入口设置实例讲解
Dec 15 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导出excel格式数据问题
2014/03/11 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
js变量以及其作用域详解
2020/07/18 Javascript
纯文字版返回顶端的js代码
2013/08/01 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
node.js的事件机制
2017/02/08 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
详解如何修改 node_modules 里的文件
2020/05/22 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
[01:40]2014DOTA2国际邀请赛 三冰SOLO赛后采访恶搞
2014/07/09 DOTA
python追加元素到列表的方法
2015/07/28 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
Python实现读取并保存文件的类
2017/05/11 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
用JAVA SOCKET编程,读服务器几个字符,再写入本地显示
2012/11/25 面试题
公司同意接收函
2014/01/13 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
优秀志愿者感言
2015/08/01 职场文书
大学生军训感言
2015/08/01 职场文书
学法用法心得体会(2016推荐篇)
2016/01/21 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL