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判断字符以及字符串的包含方法属性
Aug 30 PHP
PHP随机数生成代码与使用实例分析
Apr 08 PHP
php中用数组的方法设置cookies
Apr 21 PHP
简单的PHP缓存设计实现代码
Sep 30 PHP
php长字符串定义方法
Jul 12 PHP
PHP管理内存函数 memory_get_usage()使用介绍
Sep 23 PHP
使用PHP生成二维码的两种方法(带logo图像)
Mar 14 PHP
PHP获取文件扩展名的4种方法
Nov 24 PHP
php好代码风格的阶段性总结
Jun 25 PHP
php 中的信号处理操作实例详解
Mar 04 PHP
Yii 框架使用数据库(databases)的方法示例
May 19 PHP
php使用自带dom扩展进行元素匹配的原理解析
May 29 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中输出转义JavaScript代码的实现代码
2011/04/22 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
PHP类的自动加载机制实现方法分析
2019/01/10 PHP
模拟select的代码
2011/10/19 Javascript
uploadify 3.0 详细使用说明
2012/06/18 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
JS代码判断IE6,IE7,IE8,IE9的函数代码
2013/08/02 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
jQuery多个input求和的实现方法
2015/02/12 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
pycham查看程序执行的时间方法
2018/11/29 Python
Python实现Event回调机制的方法
2019/02/13 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
广州品高软件.net笔面试题目
2012/04/18 面试题
sort命令的作用和用法
2012/11/04 面试题
建筑工程自我鉴定
2013/10/18 职场文书
外国语学院毕业生自荐信
2013/10/28 职场文书
普师专业个人自荐信范文
2013/11/26 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
大学生军训自我鉴定范文
2014/09/18 职场文书
校运会新闻稿
2015/07/17 职场文书
二胎满月酒致辞
2015/07/29 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
通知怎么写?
2019/04/17 职场文书