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 相关文章推荐
JAVA/JSP学习系列之二
Oct 09 PHP
获得Google PR值的PHP代码
Jan 28 PHP
php实现mysql数据库备份类
Mar 20 PHP
PHP MYSQL乱码问题,使用SET NAMES utf8校正
Nov 30 PHP
php字符编码转换之gb2312转为utf8
Oct 28 PHP
php插入排序法实现数组排序实例
Feb 16 PHP
PHP设计模式之适配器模式代码实例
May 11 PHP
php学习笔记之mb_strstr的基本使用
Feb 03 PHP
phpMyAdmin通过密码漏洞留后门文件
Nov 20 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
Oct 08 PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 PHP
TP5多入口设置实例讲解
Dec 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
PHP:风雨欲来 路在何方?
2006/10/09 PHP
php自动适应范围的分页代码
2008/08/05 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
PHP实现页面静态化深入讲解
2021/03/04 PHP
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
jQuery 工具函数学习资料
2010/04/29 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
jQuery元素选择器用法实例
2014/12/23 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
微信小程序 wxapp视图容器 view详解
2016/10/31 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
2018/01/02 jQuery
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
[02:46]解说DC:感谢430陪伴我们的DOTA2国际邀请赛岁月
2016/06/29 DOTA
python 字符串split的用法分享
2013/03/23 Python
pygame学习笔记(5):游戏精灵
2015/04/15 Python
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
pandas object格式转float64格式的方法
2018/04/10 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
python实现决策树分类
2018/08/30 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
python读写文件write和flush的实现方式
2020/02/21 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
信息系统专业个人求职信范文
2013/12/07 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS
MySQL创建管理HASH分区
2022/04/13 MySQL