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 相关文章推荐
PHP4在WinXP下IIS和Apache2服务器上的安装实例
Oct 09 PHP
PHP脚本的10个技巧(6)
Oct 09 PHP
用PHP实现多服务器共享SESSION数据的方法
Mar 16 PHP
PHP EOT定界符的使用详解
Sep 30 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
Apr 09 PHP
PHP正则表达式之定界符和原子介绍
Oct 05 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 PHP
使用PHP导出Redis数据到另一个Redis中的代码
Mar 12 PHP
php读取远程gzip压缩网页的方法
Dec 29 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
php微信公众平台配置接口开发程序
Sep 22 PHP
php微信公众号开发之微信企业付款给个人
Oct 04 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详细彻底学习Smarty
2008/03/27 PHP
php下把数组保存为文件格式的实例应用
2010/02/08 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
微信小程序与公众号卡券/会员打通的问题
2019/07/25 Javascript
js实现验证码功能
2020/07/24 Javascript
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
Python实现Linux中的du命令
2017/06/12 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
使用python生成目录树
2018/03/29 Python
利用python库在局域网内传输文件的方法
2018/06/04 Python
Python实现SMTP邮件发送
2020/06/16 Python
Django serializer优化类视图的实现示例
2020/07/16 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
斐乐美国官方网站:FILA美国
2019/03/01 全球购物
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
const char*, char const*, char*const的区别是什么
2014/07/09 面试题
如何利用find命令查找文件
2015/02/07 面试题
大学社团活动策划书
2014/01/26 职场文书
学生会主席演讲稿
2014/04/25 职场文书
学生评语集锦
2015/01/04 职场文书
创建文明城市倡议书
2015/04/28 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
2015年教师党员个人总结
2015/11/24 职场文书
廉洁自律承诺书2016
2016/03/25 职场文书
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python