Laravel 认证用户注销错误

Laravel authenticated user logout error

尝试使用 laravel 默认控制器 (auth/password) 在我的站点上实现一个简单的用户 register/login 功能,但是一旦我登录,class RedirectIfAuthenticated 句柄函数阻止所有对 auth url 的访问,因此我不能再注销了。是否有错误,我需要在句柄函数上写一个异常,或者我错过了什么? 这是 class 默认情况下的样子:

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        //dd($next($request));
        if (Auth::guard($guard)->check()) {
            return redirect('/articles');
        }

        return $next($request);
    }
}

AuthController 的构造函数应该与此类似:

public function __construct()
{
    $this->middleware('guest', ['except' => 'logout']);
}

guest 中间件由 RedirectIfAuthenticated class 处理,为了使 logout 功能正常工作,您应该选择一:

  • 从您的 AuthController 调用 logout 方法。
  • 调用您用于注销的任何方法并将其排除在 AuthController 的构造函数中:

    public function __construct()
    {
        $this->middleware('guest', ['except' => '<whichever_method>']);
    }
    

出于潜在的更高级的原因和需求,我将展示一个不同的想法。

在任何中间件中,一个人可以实现自己的 except 列表。这里有一个参考:

<?php

namespace App\Http\Middleware;

use Closure;

class CustomThing
    protected $except = [
        'api/logout',
        'api/refresh',
    ];

    public function handle($request, Closure $next)
    {
        foreach ($this->except as $excluded_route) {
            if ($request->path() === $excluded_route) {
                \Log::debug("Skipping $excluded_route in this middleware...");

                return $next($request);
            }
        }

        \Log::debug('Doing middleware stuff... '. $request->url());

    }

}

我会把它扩展到支持其他类型的 URL 来发挥想象力。例如,调查 $request->url()$request->fullUrl()$request->is('admin/*').

等匹配器

一个人可以调查 VerifyCsrfToken 中间件的供应商代码,并使他们的自定义代码支持这样的东西:

    protected $except = [
        'api/logout',
        'api/refresh',
        'foo/*',
        'http://www.external.com/links',
    ];

如果您希望它成为可重用的解决方案,请将该匹配算法设为特征并将其导入到您想要从中排除路由的任何中间件。