Laravel经过身份验证的用户注销错误

问题描述 投票:3回答:2

试图使用laravel默认控制器(auth / password)在我的网站上实现一个简单的用户注册/登录功能,但是一旦我登录,RedirectIfAuthenticated类的handle函数将阻止所有对auth url的访问,因此我无法注销。是否存在错误,我需要在handle函数上编写异常,还是错过了某些事情?这是默认情况下类的外观:

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);
    }
}
laravel authentication logout
2个回答
5
投票
AuthController的构造函数应类似于此:

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

guest中间件由RedirectIfAuthenticated类处理,并且为了使

logout功能正常工作,您应该选择以下一种:

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

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


0
投票
出于潜在的更高级的原因和需求,我将提出不同的想法。

在任何中间件中,一个人都可以实现自己的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', ];

如果要使其成为可重用的解决方案,请将匹配算法设为特质,然后将其导入要从中排除路由的任何中间件中。
© www.soinside.com 2019 - 2024. All rights reserved.