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实现ftp上传文件示例
Aug 21 PHP
护卫神php套件 php版本升级方法(php5.5.24)
May 10 PHP
浅析PHP中Session可能会引起并发问题
Jul 23 PHP
php解析url并得到url中的参数及获取url参数的四种方式
Oct 26 PHP
thinkPHP实现将excel导入到数据库中的方法
Apr 22 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
Feb 08 PHP
PHP中的函数声明与使用详解
May 27 PHP
PHP手机号中间四位用星号*代替显示的实例
Jun 02 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
php实现支付宝当面付(扫码支付)功能
May 30 PHP
PHP实现的超长文本分页显示功能示例
Jun 04 PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 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
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
php检索或者复制远程文件的方法
2015/03/13 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
浅析jQuery对select操作小结(遍历option,操作option)
2013/07/04 Javascript
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
[07:54]DOTA2-DPC中国联赛 正赛 iG vs VG 选手采访
2021/03/11 DOTA
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
从Python程序中访问Java类的简单示例
2015/04/20 Python
python DataFrame 修改列的顺序实例
2018/04/10 Python
pandas-resample按时间聚合实例
2019/12/27 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
2020/01/15 Python
Python输出指定字符串的方法
2020/02/06 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
pandas的resample重采样的使用
2020/04/24 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
Python同时处理多个异常的方法
2020/07/28 Python
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
工程管理专业个人求职信范文
2013/12/07 职场文书
幼儿园小班家长寄语
2014/04/02 职场文书
离职感谢信
2015/01/21 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
Python基础详解之邮件处理
2021/04/28 Python
python ansible自动化运维工具执行流程
2021/06/24 Python
python利用while求100内的整数和方式
2021/11/07 Python
Golang 并发编程 SingleFlight模式
2022/04/26 Golang