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+DBM的同学录程序(5)
Oct 09 PHP
随时给自己贴的图片加文字的php代码
Mar 08 PHP
php中static静态变量的使用方法详解
Jun 04 PHP
php排序算法(冒泡排序,快速排序)
Oct 09 PHP
thinkphp特殊标签用法概述
Nov 24 PHP
PHP处理大量表单字段的便捷方法
Feb 07 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
Apr 03 PHP
PHP关联数组实现根据元素值删除元素的方法
Jun 26 PHP
php字符串操作常见问题小结
Oct 11 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
Yii2框架可逆加密简单实现方法
Aug 25 PHP
PHP+redis实现微博的推模型案例分析
Jul 10 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 表单数据的获取代码
2009/03/10 PHP
php目录操作实例代码
2014/02/21 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
PHP封装的简单连接MongoDB类示例
2019/02/13 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
JavaScript 学习点滴记录
2009/04/24 Javascript
一段批量给页面上的控件赋值js
2010/06/19 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
jquery点击改变class并toggle的实现代码
2016/05/15 Javascript
vue实现商城上货组件简易版
2017/11/27 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
详解create-react-app 自定义 eslint 配置
2018/06/07 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
用Python的urllib库提交WEB表单
2009/02/24 Python
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
Python实现读取json文件到excel表
2017/11/18 Python
10个Python小技巧你值得拥有
2018/09/29 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
Python实现微信小程序支付功能
2019/07/25 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
美国知名运动产品零售商:Foot Locker
2016/07/23 全球购物
德国家具折扣店:POCO
2020/02/28 全球购物
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
上学迟到的检讨书
2014/01/11 职场文书
飞机制造技术专业求职信
2014/07/27 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
社区结对共建协议书
2016/03/23 职场文书
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript