
laravel默认邮件验证中间件会阻止访客访问。本文将指导如何创建自定义中间件,实现对访客用户放行,而对已登录用户强制执行邮件验证,从而在不影响公共页面可访问性的前提下,确保所有认证用户的邮箱均已验证。
在Laravel应用开发中,我们经常会遇到这样的需求:某些页面允许未登录的访客访问(例如博客文章详情页),但一旦用户登录,无论访问任何页面,都必须先完成邮箱验证。Laravel自带的verified中间件(即EnsureEmailIsVerified)在处理这类场景时存在局限性,因为它会首先检查用户是否已认证,如果已认证但未验证邮箱,则会重定向到验证通知页面。这意味着如果将verified中间件应用于公共路由,访客用户也会被要求登录才能访问,这与我们的初衷相悖。
为了解决这一问题,我们可以创建一个自定义中间件,它能够智能地判断当前请求的用户状态:如果是访客,则允许其继续访问;如果是已认证用户但邮箱未验证,则强制其进行邮箱验证。
首先,我们需要生成一个新的中间件。可以使用Artisan命令来完成:
php artisan make:middleware EnsureEmailIsVerifiedUnlessGuest
这会在app/Http/Middleware目录下创建一个名为EnsureEmailIsVerifiedUnlessGuest.php的文件。接下来,修改该文件的handle方法,实现我们所需的分级验证逻辑:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\URL;
class EnsureEmailIsVerifiedUnlessGuest
{
/**
* 处理传入的请求。
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $redirectToRoute
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse|null
*/
public function handle($request, Closure $next, $redirectToRoute = null)
{
// 检查当前请求是否有认证用户,并且该用户需要邮箱验证但尚未验证
if (
$request->user() && // 确保有用户登录
($request->user() instanceof MustVerifyEmail && // 确保用户模型实现了MustVerifyEmail接口
! $request->user()->hasVerifiedEmail()) // 确保邮箱尚未验证
) {
// 如果是API请求,返回403错误
// 否则,重定向到邮箱验证通知页面
return $request->expectsJson()
? abort(403, '您的邮箱地址尚未验证。')
: Redirect::guest(URL::route($redirectToRoute ?: 'verification.notice'));
}
// 允许请求继续处理
return $next($request);
}
}代码解析:
创建完中间件后,需要将其注册到app/Http/Kernel.php文件的$routeMiddleware数组中,以便可以在路由中使用一个简短的别名来引用它:
// app/Http/Kernel.php
protected $routeMiddleware = [
// ... 其他中间件
'verified-or-guest' => \App\Http\Middleware\EnsureEmailIsVerifiedUnlessGuest::class,
];这里我们为它指定了别名verified-or-guest。
现在,你可以在任何需要此分级验证逻辑的路由上应用这个自定义中间件了。例如,你希望所有路由都遵循这个规则:
// routes/web.php
Route::middleware(['web', 'verified-or-guest'])->group(function () {
Route::get('/', function () {
return view('welcome');
});
Route::get('/posts/{id}', function ($id) {
// 访客和已验证用户都可以访问
// 未验证的登录用户会被重定向
return "Viewing post " . $id;
});
// ... 其他路由
});通过将verified-or-guest中间件应用于路由组,所有这些路由都将遵循以下行为:
通过上述步骤,我们成功地实现了一个灵活的邮箱验证机制。这个自定义中间件的核心优势在于它能够区分访客和已认证用户,仅对后者强制执行邮箱验证,从而完美解决了在公共页面上应用邮箱验证中间件的冲突。
注意事项:
以上就是Laravel中实现访客与登录用户分级邮件验证的策略的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号