Laravel验证了用户注销错误

时间:2016-01-02 18:54:17

标签: laravel authentication logout

尝试使用laravel默认控制器(auth / password)在我的站点上实现一个简单的用户注册/登录功能,但是一旦我登录,类RedirectIfAuthenticated句柄功能就会阻止对auth url的所有访问,因此我无法注销了。是否有错误,我需要在句柄功能上写一个例外或者我错过了什么? 以下是默认情况下该类的外观:

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);
    }
}

2 个答案:

答案 0 :(得分:4)

AuthController的构造函数应该类似于:

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

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

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

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

答案 1 :(得分: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',
    ];

如果您希望它是可重用的解决方案,则将该匹配算法设为Trait,然后将其导入要从中排除路由的任何中间件。