【问题标题】:Laravel authenticated user logout errorLaravel 认证用户注销错误
【发布时间】:2016-04-06 18:54:54
【问题描述】:

尝试使用 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);
    }
}

【问题讨论】:

    标签: laravel authentication logout


    【解决方案1】:

    AuthController 的构造函数应该如下所示:

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

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

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

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

    【讨论】:

    • 此解决方案适用于 Laravel 5+。如果您使用的是 Laravel,请考虑过滤器而不是中间件。我认为解决方案应该是一样的。
    • 感谢您的解释! :)
    • 这完全有助于我将注意力集中在'except' 键上。我的控制器操作是getLogout(),所以中间件阻止了注销。将中间件更改为getLogout 并成功!
    【解决方案2】:

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

    在任何中间件中,一个人都可以实现自己的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-&gt;url()$request-&gt;fullUrl()$request-&gt;is('admin/*') 等匹配器。

    一个人可以调查VerifyCsrfToken 中间件的供应商代码,并让他们的自定义中间件支持如下:

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 2014-07-19
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      相关资源
      最近更新 更多