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 相关文章推荐
Extended CHM PHP 语法手册之 DIY
Oct 09 PHP
PHP如何透过ODBC来存取数据库
Oct 09 PHP
PHP防止表单重复提交的几种常用方法汇总
Aug 19 PHP
php基于双向循环队列实现历史记录的前进后退等功能
Aug 08 PHP
php.ini中date.timezone设置详解
Nov 20 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
Jan 07 PHP
PHP实现大数(浮点数)取余的方法
Feb 18 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
Mar 08 PHP
php7安装mongoDB扩展的方法分析
Aug 02 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
Jun 16 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
Oct 30 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一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
php从字符串创建函数的方法
2015/03/16 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
PHP实现链式操作的核心思想
2015/06/23 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
2016/08/21 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
2017/08/15 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
struts2 jquery 打造无限层次的树
2009/10/23 Javascript
再谈javascript图片预加载技术(详细演示)
2011/03/12 Javascript
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
2017/08/17 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
vue自动化路由的实现代码
2019/09/30 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
详解Vue中的watch和computed
2020/11/09 Javascript
Python实现读写INI配置文件的方法示例
2018/06/09 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
2020/02/29 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
春节超市活动方案
2014/08/14 职场文书