虽然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. ABAP常用function 收藏
  2. 经典C语言程序100例之四七
  3. windebug常用命令
  4. ”易书网“开发总结——管理篇
  5. 127.0.0.1 myz.php,附录 – 1.0升级到2.0注意事项 - GatewayWorker 2.x 3.x 手册
  6. 全栈python_Pyodide:在浏览器端实现Python全栈科学计算
  7. EH使用IPMI基础操作
  8. 中国科学院大学2019年数学分析考研试题
  9. Linux内核 eBPF基础:perf(2):perf性能管理单元PMU的注册
  10. CSS3有趣的渐变色
  11. 微软最爽命令行工具将成 Win11 默认终端
  12. 示波器分析IIC波形图
  13. SSM框架介绍与搭建
  14. PyCharm连接MySQL数据库的时候,驱动下载失败
  15. FPGA中LUT设计
  16. [kuanbin带我飞]的专题1---简单搜索
  17. Word 2007中文版完全自学手册视频教程
  18. 【君思智慧园区】智慧园区管理系统解决方案
  19. VMware安装Ghost的系统
  20. error: Microsoft Visual C++ 14.0 is required. Get it with Microsoft Visual C++ Build安装scrapy出错解决方法

热门文章

  1. 华联、联华、世纪华联、百联
  2. Tableau图表 • 瀑布图
  3. requests下载视屏
  4. 项目-20-开发社区搜索功能
  5. 面向接口编程实施模块化/组件化解耦,以友盟、极光等统计分析为例
  6. Spring Security 六 WebSecurityConfigurerAdapter
  7. [转载]Win 7 OS: ReadyFor4G使用方法
  8. 日记侠:告诉你一个借助朋友圈吸粉裂变的套路
  9. [性格][管理]《九型人格》 -- 唐·理查德·里索(美)、拉斯·赫德森(美)
  10. 由浅入深的了解高速数据采集卡