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使用方法集锦
Mar 25 PHP
php mysql数据库操作类
Jun 04 PHP
php面向对象全攻略 (三)特殊的引用“$this”的使用
Sep 30 PHP
PHP Session变量不能传送到下一页的解决方法
Nov 27 PHP
PHP操作数组的一些函数整理介绍
Jul 17 PHP
PHP无刷新上传文件实现代码
Sep 19 PHP
PHP number_format() 函数定义和用法
Jun 01 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
Sep 05 PHP
thinkPHP批量删除的实现方法分析
Nov 09 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
Jul 27 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
Feb 21 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
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
Javascript的IE和Firefox兼容性汇编
2006/07/01 Javascript
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
基于jquery实现的鼠标滑过按钮改变背景图片
2011/07/15 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
vue的for循环使用方法
2019/02/12 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
实例讲解React 组件
2020/07/07 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
[01:31:22]Ti4 循环赛第四日附加赛LGD vs Mouz
2014/07/13 DOTA
windows下安装python paramiko模块的代码
2013/02/10 Python
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
使用Python读取安卓手机的屏幕分辨率方法
2018/03/31 Python
Python 循环语句之 while,for语句详解
2018/04/23 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
Python中的延迟绑定原理详解
2019/10/11 Python
python实现输入的数据在地图上生成热力图效果
2019/12/06 Python
Pytorch 实现权重初始化
2019/12/31 Python
Python用input输入列表的实例代码
2020/02/07 Python
python脚本和网页有何区别
2020/07/02 Python
PyTorch: Softmax多分类实战操作
2020/07/07 Python
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
英国快时尚女装购物网站:PrettyLittleThing
2018/08/15 全球购物
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
幼儿园教师备课制度
2014/01/12 职场文书
执行总经理岗位职责
2014/02/03 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
Win10系统下配置Java环境变量
2021/06/13 Java/Android