【问题标题】:Laravel Multiple Middleware cause redirect loopLaravel 多个中间件导致重定向循环
【发布时间】:2018-05-28 17:19:42
【问题描述】:

我有一个中间件组,我想将另一个中间件应用到该视图中的一个特定路径,即如果配置文件未完成,用户在完成他的配置文件并提交之前无法转到任何其他路径。

更具体地说,中间件导致重定向循环,因为我有 2 个中间件。

我使用 laravel php artisan 创建了中间件,并检查用户是否个人资料不完整,他应该重定向到个人资料/编辑页面,但它甚至不能仅检查不完整的空公司名称。

中间件

class incompleteProfile
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(empty(Auth::user()->details['companyname'])){
            return redirect()->route('profile');
        }
        return $next($request);
    }
}

路由文件

Routes
Route::group(['middleware'=>['auth'] ], function(){


// User Profile
Route::get('/profile/edit', 'UserController@profile')->name('profile')->middleware('incompleteProfile');
Route::post('/profile/edit', 'UserController@editProfile')->name('editProfile');

【问题讨论】:

  • 您的 if 语句中有错误。它应该是if(Auth::user()->details['companyname'] == ""){...},没有empty()。如果公司名称是用户的直接属性,您可以写if(Auth::user()->companyname == ""){...}
  • 另外你必须在app/Http/kernel.php (laravel.com/docs/5.5/middleware#registering-middleware)中注册你的中间件
  • 我的中间件已注册,但当条件匹配时,它会一次又一次地重定向,然后浏览器崩溃
  • if(empty(Auth::user()->details['companyname']) 这个东西现在可以工作了,但是它一次又一次地重定向,浏览器给你这个错误重定向了太多次。
  • 另一个问题可能是,您的编辑页面只能通过 POST 访问。所以每个重定向都进入 Route::get() 而不是 Route::post()。您应该将您的第一条路线(受保护的路线)重命名为/profile。你的编辑路线应该是Route::match(['post','get'],'/profile/edit','UserController@editProfile')。在您的控制器中,您必须检查当前方法是 post 还是 get 并返回带有编辑表单的视图或处理表单输入。

标签: php laravel middleware


【解决方案1】:

lagbox 答案几乎说明了为什么它不起作用的逻辑。 像这样试试。

Route::group(['middleware'=>['auth'] ], function(){


// User Profile

    Route::get('/profile/edit', 'UserController@profile')->name('profile');

    Route::group(['middleware'=>['incompleteProfile'] ], function(){
      Route::post('/profile/edit', 'UserController@editProfile')->name('editProfile');
      //ETC
    });

});

【讨论】:

  • 不幸的是,如果他们将该中间件放在 editProfile 上,他们将永远无法“更新”他们的个人资料,因为由于中间件,他们将无法提交到该路线,所以同样的问题,他们可以立即查看表格
  • 我假设配置文件是在此路线之外编辑的,因为正如您所说,要求用户登录以登录是没有意义的。如果用户需要能够填写配置文件,则“editProfile”路由会在组外以及组内的所有其他路由
  • 呵呵,我和你在一起,这很奇怪,只是试图与他们的例子保持一致,但信息有限,因为这不太有意义
  • 我知道这很奇怪,如果是我的应用程序,我已经在注册页面上完成了所有这些。但是是的,公司要求您只有一个选择,我会这样做,您必须以他们的方式而不是您的方式来做,这就是软件公司的工作方式。谢谢你们快乐编码。
【解决方案2】:

如果您将该中间件放在profile 路由上......他们怎么能到达profile 路由以获取表单以更新配置文件以添加缺少的信息?

您是说...如果公司名称的用户详细信息为空,则重定向到profile,但您在profile 上有那个中间件...所以它将永远重定向到profile,因为中间件告诉它。在这种情况下,您的用户永远无法访问profile

这相当于将auth 中间件分配给login 页面。 auth 中间件检查用户当前是否已通过身份验证。这意味着如果用户未通过身份验证,他们将永远无法访问login,在这种情况下,login 要求他们“登录”。

【讨论】:

  • 不错。 (还有 10 个……)
  • 甜,还有 10 个什么?
  • 字符供评论。 :D
  • 呵呵 :)(还有 7 个)
猜你喜欢
  • 2015-11-09
  • 2018-04-24
  • 2014-09-11
  • 2020-02-19
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多