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 相关文章推荐
javascript,php获取函数参数对象的代码
Feb 03 PHP
ThinkPHP 防止表单重复提交的方法
Aug 08 PHP
使用php判断浏览器的类型和语言的函数代码
Feb 28 PHP
基于PHP Socket配置以及实例的详细介绍
Jun 13 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 PHP
腾讯CMEM的PHP扩展编译安装方法
Sep 25 PHP
两种php实现图片上传的方法
Jan 22 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
Jun 16 PHP
ThinkPHP5 的简单搭建和使用详解
Nov 15 PHP
php将字符串转换为数组实例讲解
May 05 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的库,结果发现很多东西
2006/12/31 PHP
PHP 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
javascript中xml操作实现代码
2011/11/21 Javascript
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
js星星评分效果
2014/07/24 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
AngularJS中filter的使用实例详解
2017/08/25 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
js实现登录拖拽窗口
2020/02/10 Javascript
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
python的dict,set,list,tuple应用详解
2014/07/24 Python
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
Python教程之全局变量用法
2016/06/27 Python
python笔记:mysql、redis操作方法
2017/06/28 Python
Python正则表达式指南 推荐
2018/10/09 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
详解Python3之数据指纹MD5校验与对比
2019/06/11 Python
python写入文件自动换行问题的方法
2019/07/05 Python
python多线程实现代码(模拟银行服务操作流程)
2020/01/13 Python
食品销售计划书
2014/04/26 职场文书
学校会议通知范文
2015/04/15 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
团结友爱主题班会
2015/08/13 职场文书
python not运算符的实例用法
2021/06/30 Python
利用js实现简单开关灯代码
2021/11/23 Javascript