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 相关文章推荐
php的计数器程序
Oct 09 PHP
dedecms防止FCK乱格式化你的代码的修改方法
Mar 17 PHP
php smarty模板引擎的6个小技巧
Apr 24 PHP
QQ互联一键登录审核不通过的解决方案
Sep 10 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
php判断文件夹是否存在不存在则创建
Apr 09 PHP
通过Email发送PHP错误的方法
Jul 20 PHP
PHP实现文件上传下载实例
Oct 18 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
基于CI框架的微信网页授权库示例
Nov 25 PHP
Yii2第三方类库插件Imagine的安装和使用
Jul 06 PHP
基于PHP实现邮箱验证激活过程详解
Oct 28 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
PL-880隐藏功能
2021/03/01 无线电
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
php闭包中使用use声明变量的作用域实例分析
2018/08/09 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
对于Javascript 执行上下文的全面了解
2017/09/05 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
2018/12/05 jQuery
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
使用tensorflow实现线性svm
2018/09/07 Python
详解python中各种文件打开模式
2020/01/19 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
2020/05/08 Python
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
献爱心倡议书
2014/04/14 职场文书
初三学习计划书范文
2014/04/30 职场文书
企业安全生产承诺书
2014/05/22 职场文书
2014年服务员工作总结
2014/11/18 职场文书
小学教学工作总结2015
2015/05/13 职场文书
2019安全宣传标语大全
2019/08/14 职场文书
《雪域豹影》读后感:父爱的伟大
2019/12/23 职场文书
python设置 matplotlib 正确显示中文的四种方式
2021/05/10 Python
mysql数据库隔离级别详解
2022/06/16 MySQL
zabbix如何添加监控主机和自定义监控项
2022/08/14 Servers