laravel6开发论坛-邮箱验证

我们将只允许邮箱认证通过的用户使用网站,未认证用户会被引导进入验证邮箱页面。

『邮箱认证』工作机制一般分两步:

  1. 发送认证邮件 ------ 将附带认证信息的『认证链接』发送到用户邮箱里;

  2. 检测认证链接 ------ 用户打开邮件,点击认证链接进入网站,程序检测 URL 中认证参数的合法性,并渲染对应的页面。

以上流程非常通用,Laravel 默认自带了这个功能,我们可以很方便地进行集成。

屡一下产品思路:

  1. 用户注册成功后,给用户发送一个认证邮件;

  2. 用户登录状态下,如邮箱未认证,重定向到提醒验证邮箱的页面中。

修改模型存放位置

现在让我们先来创建一个 app/Models 文件夹,并将 User.php 文件放置到其中。

bash 复制代码
mv app/User.php app/Models/User.php

1、修改 User.php 文件,更改 namespace 为我们新创建的文件夹路径:

app/Models/User.php

php 复制代码
<?php

namespace App\Models;
.
.
.

编辑器全局搜索 App\User 替换为 App\Models\User ,按钮替换全部:

修改 User 模型

接下来我们将修改 User 模型,将 Laravel 自带的邮箱认证功能集成到我们的程序中。

php 复制代码
<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    // ...
}

添加路由中间

路由中间件 可用于仅允许经过验证的用户访问指定路由。

rust 复制代码
Route::get('/', [\App\Http\Controllers\PagesController::class,'root'])->name('root')->middleware('verified'); // <-邮箱验证规则

->middleware('verified');// 只有经过验证的用户才能进..

开始测试

测试之前,我们先设置下邮件发送到 log 中,以便后面的测试:

.env

ini 复制代码
MAIL_DRIVER=smtp

修改成

MAIL_DRIVER=log

修改成功后浏览器访问larabbs.test:8080/register ,填写表单并注册一个测试用户:

注册成功后,打开日志存放目录 storage/logs ,打开最近一天的 .log 文件,在文件最尾部应可见类似以下:

邮件成功发送,复制以上的激活链接,找个地方记录起来,先不要浏览器访问,后续会用到。

接下来我们将使用 来过滤用户的所有请求,如果用户未认证的话,就跳转到邮件认证提醒的页面中。

go 复制代码
php artisan make:middleware EnsureEmailIsVerified

打开生成的文件并代入以下内容:

app/Http/Middleware/EnsureEmailIsVerified.php

php 复制代码
<?php

namespace App\Http\Middleware;

use Closure;

class EnsureEmailIsVerified
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    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, '您的电子邮件地址未经验证.')
                : redirect()->route('verification.notice');
        }

        return $next($request);
    }
}

接下来注册中间件,注册的时机确保在 StartSession 后面即可:

app/Http/Kernel.php

ruby 复制代码
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \App\Http\Middleware\EnsureEmailIsVerified::class, // <<--- 只需添加这一行,过滤用户的所有请求,如果用户未认证的话,就跳转到邮件认证提醒的页面中
    ],

刷新页面,即可看到认证提醒,并且除了我们上面代码中设置的 URL 外都会进入此页面:

内置邮箱认证还有个小功能,当你点击点击多次『重新发送 Email』后,系统会自动做限额处理,你可以在VerificationController 中配置相应的信息:

最后测试

相关推荐
上进小菜猪3 小时前
把 KES 集群交给 Kubernetes 的九十天:一个 DBA 的试用实录
后端
两点王爷4 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
考虑考虑4 小时前
Springboot环境变量占位符语法
spring boot·后端·spring
步行cgn6 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
RISCV_Explorer8 小时前
RISC-V启动与运行时规范机制解析——BRS约定、HSM多核启动与设备树要求
后端·risc-v
星栈独行8 小时前
ADK-Rust 是什么?Rust 生态新一代 AI Agent 开发套件
人工智能·后端·rust
JavaGuide8 小时前
对标 MinIO!全新一代分布式文件系统正式发布
前端·后端
用户8356290780519 小时前
使用 Python 将 DOCX 转换为 Markdown
后端·python
IT_陈寒9 小时前
Vue computed属性这个坑,我居然踩了三次才爬出来
前端·人工智能·后端
孙启超10 小时前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust