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 相关文章推荐
一个简单计数器的源代码
Oct 09 PHP
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
Aug 07 PHP
php 截取字符串并以零补齐str_pad() 函数
May 07 PHP
显示程序执行时间php函数代码
Aug 29 PHP
Smarty变量调节器失效的解决办法
Aug 20 PHP
PHP语法小结之基础和变量
Nov 22 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
php自动提交表单的方法(基于fsockopen与curl)
May 09 PHP
Laravel 实现密码重置功能
Feb 23 PHP
laravel异步监控定时调度器实例详解
Jun 21 PHP
PHP 观察者模式深入理解与应用分析
Sep 25 PHP
thinkphp5.1 框架钩子和行为用法实例分析
May 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 危险函数全解析
2009/09/09 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
修改发贴的编辑功能
2007/03/07 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
JavaScript之IE的fireEvent方法详细解析
2013/11/20 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
jQuery实现的进度条效果
2015/07/15 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
js 动态给元素添加、移除事件的实现方法
2016/07/19 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
node静态服务器实现静态读取文件或文件夹
2019/12/03 Javascript
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
python爬虫使用cookie登录详解
2017/12/27 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
python实现批量图片格式转换
2020/06/16 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
Python批量安装卸载1000个apk的方法
2020/04/10 Python
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
金融行业务员的自我评价
2013/12/13 职场文书
旅游专业职业生涯规划范文
2014/01/13 职场文书
2014年电厂工作总结
2014/12/04 职场文书
会计入职心得体会
2016/01/22 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
python运行脚本文件的三种方法实例
2022/06/25 Python