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动态变静态原理
Nov 25 PHP
php为什么选mysql作为数据库? Mysql 创建用户方法
Jul 02 PHP
php 用sock技术发送邮件的函数
Jul 21 PHP
php生成SessionID和图片校验码的思路和实现代码
Mar 10 PHP
php 格式化数字的时候注意数字的范围
Apr 13 PHP
ThinkPHP之M方法实例详解
Jun 20 PHP
Thinkphp中数据按分类嵌套循环实现方法
Oct 30 PHP
php实现求相对时间函数
Jun 15 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
Jun 17 PHP
php实现xml与json之间的相互转换功能实例
Jul 07 PHP
PHP实现微信提现功能
Sep 30 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
May 06 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 Mysql编程之高级技巧
2008/08/27 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
PDO::setAttribute讲解
2019/01/29 PHP
使用Modello编写JavaScript类
2006/12/22 Javascript
JavaScript中Math对象使用说明
2008/01/16 Javascript
JQuery SELECT单选模拟jQuery.select.js
2009/11/12 Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
2010/03/23 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
jquery解决客户端跨域访问问题
2015/01/06 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
JS button按钮实现submit按钮提交效果
2016/11/01 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
2017/09/05 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
vue2 前端搜索实现示例
2018/02/26 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
jquery插件实现轮播图效果
2020/10/19 jQuery
小程序实现列表倒计时功能
2021/01/29 Javascript
在windows下Python打印彩色字体的方法
2018/05/15 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
朴素贝叶斯Python实例及解析
2018/11/19 Python
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
如何现实servlet的单线程模式
2014/08/05 面试题
教师党员思想汇报
2014/01/06 职场文书
大学生村官事迹材料
2014/01/21 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
英文感谢信范文
2015/01/21 职场文书
求职信格式范文
2015/03/19 职场文书
小学教师党员承诺书
2015/04/27 职场文书
人生遥控器观后感
2015/06/11 职场文书
详解Node.js如何处理ES6模块
2021/05/15 Javascript