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 相关文章推荐
使用sockets:从新闻组中获取文章(一)
Oct 09 PHP
php面向对象全攻略 (三)特殊的引用“$this”的使用
Sep 30 PHP
完美解决PHP中文乱码
Nov 26 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
Jun 02 PHP
spl_autoload_register与autoload的区别详解
Jun 03 PHP
php中的ini配置原理详解
Oct 14 PHP
WordPress主题制作之模板文件的引入方法
Dec 28 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
php防止sql注入的方法详解
Feb 20 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
Jul 04 PHP
PHP中用Trait封装单例模式的实现
Dec 18 PHP
PHP程序员必须知道的两种日志实例分析
May 14 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
什么是短波收听SWL
2021/03/01 无线电
PHP生成便于打印的网页
2006/10/09 PHP
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
php学习之 认清变量的作用范围
2010/01/26 PHP
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
Node.js下自定义错误类型详解
2016/10/17 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
2017/02/22 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
VUE写一个简单的表格实例
2019/08/06 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
django开发之settings.py中变量的全局引用详解
2017/03/29 Python
pandas string转dataframe的方法
2018/04/11 Python
python实现校园网自动登录的示例讲解
2018/04/22 Python
对Python 数组的切片操作详解
2018/07/02 Python
python3连接MySQL8.0的两种方式
2020/02/17 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
德国珠宝和手表在线商店:VALMANO
2019/03/24 全球购物
学生思想表现的评语
2014/01/30 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
幼儿生日活动方案
2014/08/27 职场文书
党的群众路线领导班子整改方案
2014/09/27 职场文书
2014年审计工作总结
2014/11/17 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书
决心书格式范文
2015/09/23 职场文书
宣传委员竞选稿
2015/11/19 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
《火纹风花雪月无双》预告“神秘雇佣兵” 紫发剑客
2022/04/13 其他游戏