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 相关文章推荐
文件系统基本操作类
Nov 23 PHP
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
Sep 02 PHP
攻克CakePHP系列二 表单数据显示
Oct 22 PHP
php str_pad 函数使用详解
Jan 13 PHP
PHP 字符串长度判断效率更高的方法
Mar 02 PHP
PHP5.3以上版本安装ZendOptimizer扩展
Mar 27 PHP
浅谈PHP中的
Apr 23 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
Dec 19 PHP
PHP实现的堆排序算法详解
Aug 17 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
php实现微信企业付款到个人零钱功能
Oct 09 PHP
laravel-admin的多级联动方法
Sep 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
Smarty模板快速入门
2007/01/04 PHP
WordPress开发中用于标题显示的相关函数使用解析
2016/01/07 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
2016/09/09 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
PHP安装memcache扩展的步骤讲解
2019/02/14 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
Extjs学习笔记之七 布局
2010/01/08 Javascript
javascript获取隐藏dom的宽高 具体实现
2013/07/14 Javascript
jQuery插件jFade实现鼠标经过的图片高亮其它变暗
2015/03/14 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
Python中设置变量访问权限的方法
2015/04/27 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
2015/08/16 Python
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
python使用多进程的实例详解
2018/09/19 Python
10招!看骨灰级Pythoner玩转Python的方法
2019/04/15 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
英国领先的新鲜松露和最好的松露产品供应商:TruffleHunter
2019/08/26 全球购物
搞笑婚礼主持词
2014/03/13 职场文书
日化店促销方案
2014/03/26 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
2014年党风建设工作总结
2014/11/19 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
2015年小学远程教育工作总结
2015/07/28 职场文书
音乐研修感悟
2015/11/18 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书
Golang表示枚举类型的详细讲解
2021/09/04 Golang
Java存储没有重复元素的数组
2022/04/29 Java/Android