如何解决覆盖默认的 Laravel 确保EmailIsVerified 中间件不触发
我正在使用 Laravel 8 构建一个 rest api。我想覆盖默认的 EnsureEmailisVerified
中间件并将我拥有的代码从控制器移动到该中间件中。
我在登录控制器中用于检查电子邮件是否经过验证的代码是;
if (!$user->hasVerifiedEmail()) {
return response()->json([
'message' => 'You need to confirm your account. We have sent you an activation link to your email.'
],422);
}
这很好用,但我想将其移出控制器,因此我创建了一个中间件并将代码移入其中,如下所示;
class EnsureEmailIsVerified
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request,Closure $next): mixed
{
if (! $request->user() ||
($request->user() instanceof MustVerifyEmail &&
! $request->user()->hasVerifiedEmail())) {
return response()->json([
'message' => 'You need to confirm your account. We have sent you an activation link to your email.'
],422);
}
return $next($request);
}
}
然后在我添加的 Kernel.php
文件中;
'verified' => \App\Http\Middleware\EnsureEmailIsVerified::class,
然后我的登录路径是这样的;
Route::post('login',[Auth\AuthenticationController::class,'login'])->middleware('verified');
问题在于它根本没有触发......当我点击登录路线时,它似乎没有检查电子邮件是否经过验证,只是让用户登录。
解决方法
您已将中间件设置为在身份验证路由运行之前运行。然而,身份验证路由是用户登录的地方。在中间件运行时,身份验证还没有发生。您需要将中间件切换到在主控制器请求之后运行的中间件:
class EnsureEmailIsVerified
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request,Closure $next): mixed
{
$response = $next($request);
// $request->user() may also work
if (auth()->check() &&
(auth()->user() instanceof MustVerifyEmail &&
!auth()->user()->hasVerifiedEmail())) {
auth()->logout();
return response()->json([
'message' => 'You need to confirm your account. We have sent you an activation link to your email.'
],422);
}
return $response;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。