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 相关文章推荐
smarty的保留变量问题
Oct 23 PHP
PHP array 的加法操作代码
Jul 24 PHP
PHP二维数组的去重问题解析
Jul 17 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
Jan 10 PHP
探讨PHP使用eAccelerator的API开发详解
Jun 09 PHP
php文件夹的创建与删除方法
Jan 24 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
Nov 10 PHP
php中static和const关键字用法分析
Dec 07 PHP
redis查看连接数及php模拟并发创建redis连接的方法
Dec 15 PHP
php使用变量动态创建类的对象用法示例
Feb 06 PHP
Laravel配置全局公共函数的方法步骤
May 09 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
Jun 25 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/06 PHP
php GUID生成函数和类
2014/03/10 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
PHP7 错误处理机制修改
2021/03/09 PHP
js右键菜单效果代码
2007/07/21 Javascript
jQuery 插件 将this下的div轮番显示
2009/04/09 Javascript
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
2015/02/18 Javascript
JavaScript生成SQL查询表单的方法
2015/08/13 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
2017/03/08 Javascript
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
微信浏览器禁止页面下拉查看网址实例详解
2017/06/28 Javascript
javascript实现切割轮播效果
2019/11/28 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
Python实现线程池代码分享
2015/06/21 Python
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
Python使用redis pool的一种单例实现方式
2016/04/16 Python
Python实现新浪博客备份的方法
2016/04/27 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
使用python Fabric动态修改远程机器hosts的方法
2018/10/26 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
python列表推导和生成器表达式知识点总结
2020/01/10 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
2015毕业生自我评价范文
2015/03/02 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
仰望星空观后感
2015/06/10 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书