使用中间件时获取重定向循环

时间:2019-06-11 15:37:41

标签: php laravel laravel-middleware

在Laravel应用程序中,我使用auth中间件来确保只有经过身份验证的用户才能到达特定的路由。

因此,在我的routes/web.php中,我有这样的东西:

Route::group(['middleware' => ['auth', 'user.required.fields']], function () {

}

如您所见,我添加了一个额外的中间件:user.required.fields看起来像这样

<?php

namespace App\Http\Middleware;

use Closure;

class CheckUserRequiredFields
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(auth()->user()->has_filled_required_fields){
            return $next($request);
        }
        else{
            return redirect()->route('new-user');
        }
    }
}

有问题的属性如下:

/**
 * If the user has filled in their role, department and location, allow full access to the intranet
 *
 * @return void
 */
public function getHasFilledRequiredFieldsAttribute()
{
    if ($this->role && $this->department && $this->location) {
        return true;
    } else {
        return false;
    }
}

但是,这会导致无限循环。

auth中间件中是否有某些东西会引起这种情况?几乎就像中间件反复调用自己一样。

该代码将正确地重定向到route('new-user)`,然后反复点击该路由。

1 个答案:

答案 0 :(得分:0)

我认为您在此组中定义了route('new-user')

Route::group(['middleware' => ['auth', 'user.required.fields']], function () {
    //
}

因此,它将由中间件检查,该中间件将一次又一次返回相同的路由,从而导致上述循环。

可能的解决方案是从该grop删除路由,并且也不要使用CheckUserRequiredFields中间件对其进行保护。