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中header和session_start前不能有输出原因分析
Jan 11 PHP
php利用反射实现插件机制的方法
Mar 14 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
Nov 10 PHP
PHP实现的一致性哈希算法完整实例
Nov 14 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
Dec 31 PHP
php 无限级分类 获取顶级分类ID
Mar 13 PHP
微信公众号开发之语音消息识别php代码
Aug 08 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
Oct 28 PHP
PHP三种方式实现链式操作详解
Jan 21 PHP
Laravel框架实现redis集群的方法分析
Sep 14 PHP
php ZipArchive实现多文件打包下载实例
Oct 31 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
Dec 03 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
IStream与TStream之间的相互转换
2008/08/01 PHP
Eclipse中php插件安装及Xdebug配置的使用详解
2013/04/25 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
关于删除时的提示处理(确定删除吗)
2013/11/03 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
JS查找字符串中出现最多的字符及个数统计
2017/02/04 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
2018/11/13 Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
2019/08/12 Javascript
Vue2.0 $set()的正确使用详解
2020/07/28 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
pytorch forward两个参数实例
2020/01/17 Python
Python socket连接中的粘包、精确传输问题实例分析
2020/03/24 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
一个精品风格的世界:Atterley
2019/05/01 全球购物
教师岗位职责
2013/11/17 职场文书
大学生家政服务项目创业计划书
2014/01/30 职场文书
文案策划求职信
2014/04/14 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
Java 多线程并发FutureTask
2022/06/28 Java/Android