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 相关文章推荐
oracle资料库函式库
Oct 09 PHP
PHP如何抛出异常处理错误
Mar 02 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
Oct 25 PHP
php反射应用示例
Feb 25 PHP
php输出xml属性的方法
Mar 19 PHP
php获取本机真实IP地址实例代码
Mar 31 PHP
php阳历转农历优化版
Aug 08 PHP
php 数组处理函数extract详解及实例代码
Nov 23 PHP
Yii核心验证器api详解
Nov 23 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
PHP实现微信对账单处理
Oct 01 PHP
实现PHP中session存储及删除变量
Oct 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
Yii2框架中日志的使用方法分析
2017/05/22 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
自己的js工具 Event封装
2009/08/21 Javascript
jquery 选择器部分整理
2009/10/28 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
Python中Class类用法实例分析
2015/11/12 Python
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
Python 支付整合开发包的实现
2019/01/23 Python
利用python如何在前程无忧高效投递简历
2019/05/07 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
美国五金商店:Ace Hardware
2018/03/27 全球购物
通用C#笔试题附答案
2016/11/26 面试题
个人能力自我鉴赏
2014/01/25 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
医学求职自荐信
2014/06/21 职场文书
公安四风对照检查材料思想汇报
2014/10/11 职场文书
事业单位年度考核评语
2014/12/31 职场文书
保管员岗位职责
2015/02/14 职场文书
宇宙与人观后感
2015/06/05 职场文书
八年级作文之友谊
2019/12/02 职场文书