laravel框架邮箱认证实现方法详解


Posted in PHP onNovember 22, 2019

本文实例讲述了laravel框架邮箱认证实现方法。分享给大家供大家参考,具体如下:

修改 User 模型,将 Laravel 自带的邮箱认证功能集成到我们的程序中

<?php

namespace App\Models;

use Illuminate\Notifications\Notifiable;
use Illuminate\Auth\MustVerifyEmail as MustVerifyEmailTrait;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Contracts\Auth\MustVerifyEmail as MustVerifyEmailContract;

class User extends Authenticatable implements MustVerifyEmailContract
{
  use Notifiable, MustVerifyEmailTrait;

  /**
   * The attributes that are mass assignable.
   *
   * @var array
   */
  protected $fillable = [
    'name', 'email', 'password',
  ];

  /**
   * The attributes that should be hidden for arrays.
   *
   * @var array
   */
  protected $hidden = [
    'password', 'remember_token',
  ];

  /**
   * The attributes that should be cast to native types.
   *
   * @var array
   */
  protected $casts = [
    'email_verified_at' => 'datetime',
  ];
}

代码详解:

laravel框架邮箱认证实现方法详解

加载使用 MustVerifyEmail trait,打开 vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php 文件,可以看到以下三个方法:

  • hasVerifiedEmail() 检测用户 Email 是否已认证;
  • markEmailAsVerified() 将用户标示为已认证;
  • sendEmailVerificationNotification() 发送 Email 认证的消息通知,触发邮件的发送。

得益于 PHP 的 trait 功能,User 模型在 use 以后,即可使用以上三个方法。

laravel框架邮箱认证实现方法详解

可以打开 vendor/laravel/framework/src/Illuminate/Contracts/Auth/MustVerifyEmail.php ,可以看到此文件为 PHP 的接口类,继承此类将确保 User 遵守契约,拥有上面提到的三个方法。

如果我们使用了 Laravel 自带的 RegisterController ,控制器通过加载 Illuminate\Foundation\Auth\RegistersUsers trait 来引入框架的注册功能,此时我们打开此 trait 来翻阅源码并定位到 register(Request $request) 方法:

laravel框架邮箱认证实现方法详解

此方法处理了用户提交表单后的逻辑,我们把重点放在 event(new Registered($user = $this->create($request->all())));,这里使用了 Laravel 的事件系统,触发了 Registered 事件。

打开 app/Providers/EventServiceProvider.php 文件,此文件的 $listen 属性里我们可以看到注册了Registered 事件的监听器:

laravel框架邮箱认证实现方法详解

打开 SendEmailVerificationNotification 类,阅读其源码:

vendor/laravel/framework/src/Illuminate/Auth/Listeners/SendEmailVerificationNotification.php

laravel框架邮箱认证实现方法详解

可以看出 Laravel 默认已经为我们设置了邮件发送的逻辑

强制用户认证

我们希望用户认证邮箱后,才能使用网站。

我们将使用 Laravel 中间件 来过滤用户的所有请求,如果用户未认证的话,就跳转到邮件认证提醒的页面中

可以使用以下命令来新建一个中间件:

php artisan make:middleware EnsureEmailIsVerified

打开生成的文件并代入以下内容:

app/Http/Middleware/EnsureEmailIsVerified.php

<?php

namespace App\Http\Middleware;

use Closure;

class EnsureEmailIsVerified
{
  public function handle($request, Closure $next)
  {
    // 三个判断:
    // 1. 如果用户已经登录
    // 2. 并且还未认证 Email
    // 3. 并且访问的不是 email 验证相关 URL 或者退出的 URL。
    if ($request->user() &&
      ! $request->user()->hasVerifiedEmail() &&
      ! $request->is('email/*', 'logout')) {

      // 根据客户端返回对应的内容
      return $request->expectsJson()
            ? abort(403, 'Your email address is not verified.')
            : redirect()->route('verification.notice');
    }

    return $next($request);
  }
}

接下来注册中间件,注册的时机确保在 StartSession 后面即可:

app/Http/Kernel.php

laravel框架邮箱认证实现方法详解

此时如果我们没有认证邮箱就会看到认证提醒,并且除了我们上面代码中设置的 URL 外都会进入此页面:

laravel框架邮箱认证实现方法详解

内置邮箱认证还有个小功能,当你点击点击多次『重新发送 Email』后,系统会自动做限额处理,可以有效防止用户消耗太多资源。你可以在 VerificationController 中配置相应的信息:

laravel框架邮箱认证实现方法详解

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
在Zeus Web Server中安装PHP语言支持
Oct 09 PHP
介绍几个array库的新函数 php
Dec 29 PHP
PHP strtok()函数的优点分析
Mar 02 PHP
php变量范围介绍
Oct 15 PHP
php命令行用法入门实例教程
Oct 27 PHP
php站内搜索关键词变亮的实现方法
Dec 30 PHP
php编写简单的文章发布程序
Jun 18 PHP
php实现源代码加密的方法
Jul 11 PHP
深入理解PHP内核(一)
Nov 10 PHP
php实现基于openssl的加密解密方法
Sep 30 PHP
PHP判断表达式中括号是否匹配的简单实例
Oct 22 PHP
tp5框架使用composer实现日志记录功能示例
Jan 10 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 #PHP
PHP实现微信提现功能(微信商城)
Nov 21 #PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 21 #PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 #PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 #PHP
使用PHP开发留言板功能
Nov 19 #PHP
关于Laravel参数验证的一些疑与惑
Nov 19 #PHP
You might like
php 删除记录实现代码
2009/03/12 PHP
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
JS烟花背景效果实现方法
2015/03/03 Javascript
jquery实现动静态条形统计图
2015/08/17 Javascript
jQuery密码强度检测插件passwordStrength用法实例分析
2015/10/30 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
2016/11/23 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
2020/05/12 Javascript
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python网络编程示例(客户端与服务端)
2014/04/24 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
Python函数基本使用原理详解
2020/03/19 Python
Python使用Numpy模块读取文件并绘制图片
2020/05/13 Python
怎么快速自学python
2020/06/22 Python
解决pip install psycopg2出错问题
2020/07/09 Python
python switch 实现多分支选择功能
2020/12/21 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
新闻学毕业生自荐信
2013/11/15 职场文书
2014自荐信的写作技巧
2014/01/28 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
学雷锋活动倡议书
2014/08/30 职场文书