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简单封装了一些常用JS操作
Feb 25 PHP
简单介绍下 PHP5 中引入的 MYSQLI的用途
Mar 19 PHP
mayfish 数据入库验证代码
Apr 30 PHP
色色整理的PHP面试题集锦
Mar 08 PHP
php随机显示指定文件夹下图片的方法
Jul 13 PHP
Zend Framework连接Mysql数据库实例分析
Mar 19 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
Mar 22 PHP
PHP怎样用正则抓取页面中的网址
Aug 09 PHP
关于php 高并发解决的一点思路
Apr 16 PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
Aug 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
解析coreseek for sphinx的使用
2013/06/21 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
Js实现滚动变色的文字效果
2014/06/16 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
JavaScript插件化开发教程 (二)
2015/01/27 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
jQuery继承extend用法详解
2016/10/10 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
vue watch监听对象及对应值的变化详解
2018/02/24 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
判断“命令按钮”是否被鼠标单击详解
2019/07/31 Javascript
jQuery操作元素追加内容示例
2020/01/10 jQuery
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
使用Python的PEAK来适配协议的教程
2015/04/14 Python
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
python reverse反转部分数组的实例
2018/12/13 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
Python的几种主动结束程序方式
2019/11/22 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
阿里云:Aliyun.com
2017/02/15 全球购物
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
ASICS印度官方网站:日本专业运动品牌
2020/06/20 全球购物
软件缺陷的分类都有哪些
2014/08/22 面试题
技校生自我鉴定
2013/12/08 职场文书
入党综合考察材料
2014/06/02 职场文书
技术支持岗位职责
2015/02/13 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
python中的sys模块和os模块
2022/03/20 Python