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之PHP语法学习笔记1
Dec 17 PHP
php mssql 日期出现中文字符的解决方法
Mar 10 PHP
php不用内置函数对数组排序的两个算法代码
Feb 08 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
Jul 03 PHP
PHP中date()日期函数有关参数整理
Jul 19 PHP
smarty实现多级分类的方法
Dec 05 PHP
thinkphp的dump函数无输出实例代码
Nov 15 PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
PHP长连接实现与使用方法详解
Feb 11 PHP
PHP文件后缀不强制为.php方法
Mar 31 PHP
laravel高级的Join语法详解以及使用Join多个条件
Oct 16 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
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
javascript 数组排序函数
2009/08/20 Javascript
为javascript添加String.Format方法
2020/08/11 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
JS常见问题整理(持续更新)
2013/08/06 Javascript
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
基于javascript实现全屏漂浮广告
2016/03/31 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
利用Opencv中Houghline方法实现直线检测
2018/02/11 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
numpy.linspace函数具体使用详解
2019/05/27 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
椰子猫砂:CatSpot
2018/08/27 全球购物
小学生新学期寄语
2014/01/19 职场文书
2014年教研工作总结
2014/12/06 职场文书
《开国大典》教学反思
2016/02/16 职场文书
通过Qt连接OpenGauss数据库的详细教程
2021/06/23 PostgreSQL
集英社今正式宣布 成立游戏公司“集英社Games”
2022/03/31 其他游戏