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的session功能评述(二)
Oct 09 PHP
基于mysql的论坛(5)
Oct 09 PHP
PHP 开源AJAX框架14种
Aug 24 PHP
一个简单的php加密解密函数(动态加密)
Jun 19 PHP
php利用新浪接口查询ip获取地理位置示例
Jan 20 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 PHP
Zend Framework框架路由机制代码分析
Mar 22 PHP
php截取视频指定帧为图片
May 16 PHP
php/JS实现的生成随机密码(验证码)功能示例
Jun 06 PHP
如何在PHP环境中使用ProtoBuf数据格式
Jun 19 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
Dec 30 PHP
swoole锁的机制代码实例讲解
Mar 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编程最快明白(第一讲 软件环境和准备工作)
2010/10/25 PHP
详细解读PHP中接口的应用
2015/08/12 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
2017/06/07 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
动态加载脚本提升javascript性能
2014/02/24 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
Javascript核心读书有感之词法结构
2015/02/01 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
vue实现一拉到底的滑动验证
2019/07/25 Javascript
JavaScript 反射和属性赋值实例解析
2019/10/28 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
举例介绍Python中的25个隐藏特性
2015/03/30 Python
Python字符串切片操作知识详解
2016/03/28 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
纽约海:Sea New York
2018/11/04 全球购物
联想C++笔试题
2012/06/13 面试题
工程造价专业大学生职业规划范文
2014/03/09 职场文书
小学生竞选班干部演讲稿
2014/04/24 职场文书
2015年党支部公开承诺书
2015/01/22 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android