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 相关文章推荐
提问的智慧
Oct 09 PHP
PHP分页显示制作详细讲解
Oct 09 PHP
利用文件属性结合Session实现在线人数统计
Oct 09 PHP
谈谈PHP语法(4)
Oct 09 PHP
php防盗链的常用方法小结
Jul 02 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
Aug 08 PHP
解析smarty模板中类似for的功能实现
Jun 18 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
Mar 17 PHP
smarty内部日期函数html_select_date()用法实例分析
Jul 08 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
May 18 PHP
php正则修正符用法实例详解
Dec 29 PHP
ThinkPHP5框架实现简单的批量查询功能示例
Jun 07 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 Memcached应用实现代码
2010/02/08 PHP
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
ThinkPHP控制器间实现相互调用的方法
2014/10/31 PHP
教你php如何实现验证码
2016/01/20 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
javascript中eval函数用法分析
2015/04/25 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
jquery实现拖动效果(代码分享)
2017/01/25 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
2019/09/27 Javascript
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
Django之choices选项和富文本编辑器的使用详解
2020/04/01 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
django中cookiecutter的使用教程
2020/12/03 Python
HTML5 拖放功能实现代码
2016/07/14 HTML / CSS
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
信息专业本科生个人的自我评价
2013/10/28 职场文书
电子信息毕业生自荐信
2013/11/16 职场文书
便利店促销方案
2014/02/20 职场文书
村党支部公开承诺书
2014/05/29 职场文书
中考标语大全
2014/06/05 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
买房子个人收入证明
2014/10/12 职场文书
为什么中国式养孩子很累?
2019/08/07 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
2022/04/09 MySQL