尝试使用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);
}
}
答案 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,然后将其导入要从中排除路由的任何中间件。