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 相关文章推荐
PHP开发中常用的8个小技巧
Aug 27 PHP
Thinkphp模板中使用自定义函数的方法
Sep 23 PHP
浅析PHP 按位与或 (^ 、&amp;)
Jun 21 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 PHP
解析php常用image图像函数集
Jun 24 PHP
PHP登录环节防止sql注入的方法浅析
Jun 30 PHP
ThinkPHP3.2.2的插件控制器功能简述
Jul 09 PHP
PHP文件上传判断file是否己选择上传文件的方法
Nov 10 PHP
php生成gif动画的方法
Nov 05 PHP
php删除数组指定元素实现代码
May 03 PHP
laravel 5.4中实现无限级分类的方法示例
Jul 27 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
Nov 14 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 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
2014/06/04 PHP
php短网址和数字之间相互转换的方法
2015/03/13 PHP
PHP实现的简单适配器模式示例
2017/06/22 PHP
JavaScript 字符串处理函数使用小结
2010/12/02 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
向左滚动文字 js代码效果
2013/08/17 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
使用js获取图片原始尺寸
2014/12/03 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
bootstrap flask登录页面编写实例
2016/11/01 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
weebox弹出窗口不居中显示的解决方法
2017/11/27 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
react 国际化的实现代码示例
2018/09/14 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
微信小程序实现电影App导航和轮播
2020/11/30 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
python中学习K-Means和图片压缩
2017/11/20 Python
python实现大转盘抽奖效果
2019/01/22 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
python 实现屏幕录制示例
2019/12/23 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
Python如何解除一个装饰器
2020/08/07 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
亿阳信通股份有限公司笔试题(C#)
2016/03/04 面试题
大学生简单自荐信
2013/11/10 职场文书
前台接待员岗位职责
2014/01/02 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
债务追讨授权委托书范本
2014/10/16 职场文书
护士自荐信怎么写
2015/03/06 职场文书
销售员自我评价
2015/03/11 职场文书
python前后端自定义分页器
2022/04/13 Python