laravel中间件上的重定向太多

q35jwt9p  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(181)

我已经创建了一个自定义中间件,我正在检查密码字段是否为空,并重定向用户更改密码,但它给予我重定向错误,任何人都可以帮助?让我添加更多详细信息,我希望用户重定向到/change-password如果密码字段为空

整个过程就是这样

用户验证电子邮件,如果数据库中的密码字段为空,则重定向到/change-password路由而不是 Jmeter 板,否则我们将其重定向到 Jmeter 板。用户不应访问任何路由,直到他们没有更新密码。

记住我用的是laravel breeze
中间件代码:

<?php

namespace App\Http\Middleware;

use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class ChangePasswordMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        $user = Auth::user();

        if (empty($user->password)){
            return redirect()->route('patient.password');
        } else{
            return  redirect()->intended(RouteServiceProvider::HOME);
        }

        return $next($request);
    }
}

我的路线:

Route::middleware(['auth', 'verified', 'changepassword'])->group(function (){
   Route::get('/change-password', [PatientsController::class, 'passwordView'])->name('patient.password');
   Route::get('/dashboard', [PatientsController::class, 'index'])->name('patient.dashboard');
   Route::get('pricing', [PatientsController::class, 'pricing'])->name('patient.pricing');
});

changepassword注册在我的kernel.php中,它是一个定制的中间件。
我已经尝试为路由创建一个不同的组,但它仍然不起作用,我希望changepassword中间件强制使用更改密码和其他路由,直到更新密码字段才起作用

2hh7jdfx

2hh7jdfx1#

正如在评论中提到的,中间件被一遍又一遍地调用,因为密码是空的。因此,太多重定向的问题。您的路由必须忽略/change-password的路由。

Route::middleware(['auth', 'verified', 'changepassword'])->group(function (){
       Route::get('/change-password', [PatientsController::class, 'passwordView'])
          ->name('patient.password')
          ->withoutMiddleware([\App\Http\Middleware\ChangePasswordMiddleware::class]);
       ...
       ...
    });

在此之后,你太多的重定向问题应该会消失。
另外,确保handle()方法中的if/else逻辑是正确的,因为else逻辑看起来很奇怪。

dfuffjeb

dfuffjeb2#

试试看

public function handle(Request $request, Closure $next)
{
    $user = Auth::user();

    if (empty($user->password)){
        abort(302, 'Please change your password', ['Location' => route('patient.password')]);
    }

    return $next($request);
}

如果密码为空,则会自动重定向到/change-password route。

相关问题