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 相关文章推荐
PHP4实际应用经验篇(2)
Oct 09 PHP
PHP 模拟登陆MSN并获得用户信息
May 16 PHP
php学习笔记 数组遍历实现代码
Jun 09 PHP
PHP的基本常识小结
Jul 05 PHP
PHP自动识别字符集并完成转码详解
Aug 02 PHP
ThinkPHP应用模式扩展详解
Jul 16 PHP
PHP易混淆函数的区别及用法汇总
Nov 22 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
Dec 11 PHP
PHP统计目录中文件以及目录中目录大小的方法
Jan 09 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
Jun 07 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
Jun 12 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边学边教》(01.开篇――准备工作)
2006/12/13 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
PHP判断表单复选框选中状态完整例子
2014/06/24 PHP
基于jquery的滚动新闻列表
2010/06/19 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
2013/07/08 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
js 截取或者替换字符串中的数字实现方法
2016/06/13 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
2016/12/07 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
vue 地区选择器v-distpicker的常用功能
2019/07/23 Javascript
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
Python ldap实现登录实例代码
2016/09/30 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
python中 _、__、__xx__()区别及使用场景
2020/06/30 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
自荐信封面
2013/12/04 职场文书
化学教师教学反思
2014/01/17 职场文书
美术教师自我鉴定
2014/02/12 职场文书
机关出纳岗位职责
2014/04/03 职场文书
家长学校培训材料
2014/08/20 职场文书
党的群众路线专项整治方案
2014/11/03 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
违纪检讨书
2015/01/27 职场文书
学期个人自我总结
2015/02/13 职场文书
离婚协议书范文2016
2016/03/18 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS