虽然Laravel框架中默认自带了邮箱认证的功能,可以很方便地进行集成,但我还是想搞清楚其流程,所以今天花了一上午的时间进行理解。

首先,先定义邮箱认证的业务流程。

基本业务流程如下:

  1. 用户注册成功后,系统会自动发送一个附带“认证链接”邮件到用户邮箱;
  2. 用户打开“认证链接”即为激活账号,才可以正常访问系统;
  3. 用户在未通过邮箱进行验证的情况下,所有访问都会重定向到邮箱验证页面。

然后,再看邮箱认证的代码实现。

代码实现流程如下:

1.通过use Trait将Laravel自带的邮箱认证功能集成User模型中。这个Trait中包含邮箱认证的相关方法,包括user表中相关字段判断用户Email是否已认证、将其设置为已认证等。

<?phpnamespace App\Models;use Illuminate\Contracts\Auth\MustVerifyEmail as MustVerifyEmailContract;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Auth\MustVerifyEmail as MustVerifyEmailTrait;//Contract契约,实现这个接口,继承此类将确保User遵守契约,拥有上面提到的四个方法
class User extends Authenticatable implements MustVerifyEmailContract
{//加载使用“MustVerifyEmail”Trait,这个Trait中包含邮箱认证的相关方法,包括user表中相关字段判断用户Email是否已认证、将其设置为已认证等use Notifiable, MustVerifyEmailTrait;  ......
}

2、分析laravel自带的RegisterController控制器,主要是用作邮箱认证的业务处理。其中使用了laravel的事件系统通过event(new Registered())触发Registered事件,然后使用listener对这个事件进行监听(所谓的监听就是将事件类与监听类之间建立关联)。

在RegisterController中引入了“RegistersUsers” Trait

use RegistersUsers;

在加载的Illuminate\Foundation\Auth\RegistersUsers Trait中register()方法对用户提交表单后的逻辑进行了处理。

    public function register(Request $request){// 检验用户提交的数据是否有误$this->validator($request->all())->validate();// 创建用户同时触发用户注册成功的事件,并将用户传参event(new Registered($user = $this->create($request->all())));// 登录用户$this->guard()->login($user);return $this->registered($request, $user)?: redirect($this->redirectPath());}

其中最关键的一点是使用了Laravel的事件系统,触发Registered事件。

注:laravel的事件系统就是一个简单的观察者模式,能够订阅和监听应用中发生的各种事件。事件系统有利用应用各个方面的解耦,因为单个事件可以拥有多个互不依赖的监听器。对于设计模式其实我也有点绕,后面再慢慢研究吧。

app/Providers/EventServiceProvider.php 文件的$listen属性中可以看到注册了Registered事件的监听器。

    protected $listen = [Registered::class => [SendEmailVerificationNotification::class,],];

在SendEmailVerificationNotification类里对事件进行了处理,满足一定条件的话就发送认证邮件。

class SendEmailVerificationNotification
{//处理事件public function handle(Registered $event){// 如果 user 是继承于 MustVerifyEmail 并且还未激活的话if ($event->user instanceof MustVerifyEmail && ! $event->user->hasVerifiedEmail()) {// 发送邮件认证消息通知(认证邮件)$event->user->sendEmailVerificationNotification();}}
}

3、通过Laravel中间件来过滤用户的所有请求,强制未注册用户进行认证,否则的话不能正常访问除认证页面外的其他页面。

创建一个中间件Middleware,对请求进行过滤,如果请求用户未认证的话,就跳转到邮件认证提醒的页面中。

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);}

中间件创建完成之后,需要在app/Http/Kernel.php中注册,这里要注意注册注册时机必须在StartSession后面,因为StartSession是启动会话,$request->user()的判断必须在会话已启动的情况下,否则永远都是false。

class Kernel extends HttpKernel
{...protected $middlewareGroups = ['web' => [...\Illuminate\Session\Middleware\StartSession::class,...\Illuminate\Routing\Middleware\SubstituteBindings::class,\App\Http\Middleware\EnsureEmailIsVerified::class,      // 邮箱认证中间件],];...
}

大概流程就是以上三步,虽然内容不多,但还是需要好好理解理解。

SSPU-BBS中的邮箱认证相关推荐

  1. 如何简单的在 ASP.NET Core 中集成 JWT 认证?

    前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...

  2. python认证教程_基于 Python+SendCloud 的邮箱认证

    项目简介:为了方便日后密码遗忘进行修改或者进行消息推广等,现在各大网站在注册的时候总是免不了填写邮箱验证邮箱的流程.本门课程将通过使用 SendCloud 提供的 API 来实现一个本地版的邮箱认证过 ...

  3. 登录功能中发送邮箱验证的简单使用

    登录功能中发送邮箱验证的简单使用 java开发中常用的邮箱相关的就是给邮箱发送验证码,发送验证码在java中使用javamail,它提供了一套发送和接收功能的标准,支持协议:smtp,pop3,ima ...

  4. Java APP移动端邮箱认证

    Java APP移动端邮箱认证 前言: 要实现邮箱认证服务,大致分为以下四个步骤:搭建邮箱服务.制作一个发送邮件的工具类.后台实现一个供APP调用的接口API.邮箱认证的通知回调,当然这其中还涉及到邮 ...

  5. 一文梳理SpringSecurity中的登录认证流程

    前言 SpringSecurity作为一个出自Spring家族很强大的安全框架时长被引用到SpringBoot项目中用作登录认证和授权模块使用,但是对于大部分使用者来说都只停留在实现使用用户名和密码的 ...

  6. 微信开发者和其他服务器区别,求教微信公众号开发中两种认证技术的区别?

    本人对微信开发中2个认证方式有些不解,求各位大佬给解释一番. 众所周知,在微信开发者进行开发时,有两个角色和两个场景存在,我分别描述如下: 第一个场景:微信服务器------>我的服务器. 在我 ...

  7. BBS中父模块缩进,子模块归属父模块的实现方式

    BBS中父模块缩进,子模块归属父模块的实现方式 板块显示顺序问题 在tbl_board表中增加一个显示顺序字段 order alter table tbl_board add ( order_num ...

  8. ASP.Net Core 3.1 中使用JWT认证

    JWT认证简单介绍 关于Jwt的介绍网上很多,此处不在赘述,我们主要看看jwt的结构. JWT主要由三部分组成,如下: HEADER.PAYLOAD.SIGNATURE HEADER包含token的元 ...

  9. java取邮箱前缀_java抓取网页或文件中的邮箱号码

    java抓取网页或文件中的邮箱号码 发布时间:2020-10-18 08:58:32 来源:脚本之家 阅读:69 作者:java大渣渣 本文实例为大家分享了java抓取邮箱号码的具体代码,供大家参考, ...

最新文章

  1. oracle存clob,oracle数据库里保存clob字段-Oracle
  2. 关于微型计算机主板的描述错误的是,2016年9月计算机一级考试试题及答案「单选」...
  3. 指定python 版本安装相关插件
  4. [BZOJ 2427] 软件安装
  5. .NET Core使用NPOI导出复杂Word详解
  6. ai系统架构_人工智能中的模糊逻辑系统架构
  7. 自我接纳_接纳预测因子
  8. 网络教育计算机 判断,北京师范大学网络教育计算机作业1、4、8
  9. @Component注解的用法
  10. SCPPO(二十三):SQLServer数据库备份那些事儿
  11. html中span不显示背景
  12. 摩托罗拉里程碑升级Android 2.2刷机知识
  13. 实用的BeanUtils工具类
  14. SI4463的数据冲撞解决办法
  15. oracle 获得节假日,Oracle 计算两个日期间时间排除非工作日及非工作时间
  16. 把你的桌面变成vista
  17. php随机生成微信昵称(二)
  18. php 公众平台开发教程,微信公众平台开发入门教程
  19. 2022-2028年全球与中国各向异性导电胶行业市场前瞻与投资战略规划分析
  20. 前台中文传参后台乱码解决方案

热门文章

  1. Folder Sniffer
  2. android之IM即时通信原理
  3. GOOGLE使用指南
  4. 华为手机怎么ota升级鸿蒙,华为手机如何升级鸿蒙系统 步骤如下
  5. 网吧强悍助手讯闪4.5详细图文教程(转)
  6. python随机抽号_使用python的random编写抽奖程序
  7. 刷脸支付是大数据和人工智能时代的产物
  8. 微信小程序通过低功耗蓝牙设备进行定位及测距(二)
  9. 大M法的简单matlab程序
  10. 关于命令行上执行java命令的错误分析 - Could not find or load main class