Laravel 认证用户注销错误
Posted
技术标签:
【中文标题】Laravel 认证用户注销错误【英文标题】:Laravel authenticated user logout error 【发布时间】: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);
【问题讨论】:
【参考方案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->url()
、$request->fullUrl()
和 $request->is('admin/*')
等匹配器。
一个人可以调查VerifyCsrfToken
中间件的供应商代码,并让他们的自定义中间件支持如下:
protected $except = [
'api/logout',
'api/refresh',
'foo/*',
'http://www.external.com/links',
];
如果您希望它成为可重用的解决方案,请将匹配算法设为 Trait,并将其导入您要从中排除路由的任何中间件。
【讨论】:
以上是关于Laravel 认证用户注销错误的主要内容,如果未能解决你的问题,请参考以下文章