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+MySql编写聊天室
Oct 09 PHP
php数据库连接时容易出错的特殊符号问题
Sep 01 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
Jun 25 PHP
PHP实现更新中间关联表数据的两种方法
Sep 01 PHP
php中执行系统命令的方法
Mar 21 PHP
php实现json编码的方法
Jul 30 PHP
详解WordPress中添加和执行动作的函数使用方法
Dec 29 PHP
php实现的二叉树遍历算法示例
Jun 15 PHP
PHP 实现从数据库导出到.csv文件方法
Jul 06 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
PHP基于GD2函数库实现验证码功能示例
Jan 27 PHP
Laravel 关联模型-关联新增和关联更新的方法
Oct 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
用Socket发送电子邮件
2006/10/09 PHP
php创建多级目录的方法
2015/03/24 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
js弹出确认是否删除对话框
2014/03/27 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
深入剖析javascript中的exec与match方法
2016/05/18 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
详解各版本React路由的跳转的方法
2018/05/10 Javascript
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
2018/06/13 Javascript
react native 获取地理位置的方法示例
2018/08/28 Javascript
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
2018/10/24 Javascript
JS实现简易留言板(节点操作)
2020/03/16 Javascript
Vue实现计算器计算效果
2020/08/17 Javascript
python中列表元素连接方法join用法实例
2015/04/07 Python
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
Python实现数字的格式化输出
2020/08/01 Python
python3排序的实例方法
2020/10/20 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
美国性感内衣店:Yandy
2018/06/12 全球购物
医院工作检讨书范文
2014/02/10 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
励志演讲稿500字
2014/08/21 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers