Php 设置多个身份验证保护时发生Laravel重定向错误

Php 设置多个身份验证保护时发生Laravel重定向错误,php,laravel,authentication,routes,Php,Laravel,Authentication,Routes,我已经按照本教程中所述设置了管理员身份验证保护: 路线 Route::group([ 'prefix' => 'admin', 'namespace' => 'Auth' ], function() { Route::get('/login', 'AdminController@showLogin')->name('admin.show.login'); Route::post('/login', 'AdminController@login

我已经按照本教程中所述设置了管理员身份验证保护:
路线

Route::group([
    'prefix' => 'admin',
    'namespace' => 'Auth'
], function() {

    Route::get('/login', 'AdminController@showLogin')->name('admin.show.login');
    Route::post('/login', 'AdminController@login')->name('admin.login');

    Route::group([
        'middleware' => 'auth:admin'
    ], function() {
        Route::get('/', 'AdminController@index')->name('admin.home');
        Route::get('/logout', 'AdminController@logout');
    });    
});
控制器

class AdminController extends Controller
{

    public function __construct() 
    {
        $this->middleware('guest:admin')->except('logout');
    }

    public function index() 
    {
        return "Admin authenticated";
    }

    public function showLogin() 
    {
        return view('admin.login');
    }

    public function login(Request $request)
    {
        $admin = Admin::where('login_id', $request->input('login'))->firstOrFail();
        Auth::guard('admin')->loginUsingId($admin->id, TRUE);
        return redirect()->intended(route('admin.home'));
    }

    public function logout()
    {
        Auth::guard('admin')->logout();
        return redirect()->route('admin.show.login');
    }
}
protected function unauthenticated($request, AuthenticationException $exception) 
{
    if ($request->expectsJson()) 
    {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    $guard = array_get($exception->guards(), 0);
    switch  ($guard) 
    {
        case 'admin':
            $login = 'admin.show.login';
            break;

        default:
            $login = 'login';
            break;
    }
    return redirect()->guest(route($login));
}
重定向身份验证
中间件

public function handle($request, Closure $next, $guard = null)
{
    switch ($guard) 
    {
        case 'admin':
            if (Auth::guard($guard)->check()) 
            {
                return redirect()->route('admin.home');
            }
            break;

        default:
            if (Auth::guard($guard)->check()) {
                return redirect('/home');
            }
            break;
    }
    return $next($request);
}
异常处理程序

class AdminController extends Controller
{

    public function __construct() 
    {
        $this->middleware('guest:admin')->except('logout');
    }

    public function index() 
    {
        return "Admin authenticated";
    }

    public function showLogin() 
    {
        return view('admin.login');
    }

    public function login(Request $request)
    {
        $admin = Admin::where('login_id', $request->input('login'))->firstOrFail();
        Auth::guard('admin')->loginUsingId($admin->id, TRUE);
        return redirect()->intended(route('admin.home'));
    }

    public function logout()
    {
        Auth::guard('admin')->logout();
        return redirect()->route('admin.show.login');
    }
}
protected function unauthenticated($request, AuthenticationException $exception) 
{
    if ($request->expectsJson()) 
    {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    $guard = array_get($exception->guards(), 0);
    switch  ($guard) 
    {
        case 'admin':
            $login = 'admin.show.login';
            break;

        default:
            $login = 'login';
            break;
    }
    return redirect()->guest(route($login));
}

如果在未登录的情况下访问
/admin
,则
/admin/login
视图将正确显示。登录后,
/admin
URL导致无限重定向循环错误。管理员可以使用
/admin/logout
路径成功注销。问题似乎是
重定向验证的
中间件的原因。我遗漏了什么吗?

似乎您的问题发生在
AdminController
中,特别是构造函数中

重定向循环发生在路由
/admin
上,因为中间件与
auth:admin
中间件(在路由中)和
guest:admin
中间件(在控制器中)冲突

您需要将
guest:admin
中间件应用于除
索引
注销
功能以外的所有功能:

$this->middleware('guest:admin', ['except' => ['index', 'logout']]);

我像下面的
$this->middleware('auth:admin',['except'=>['index','logout']])一样应用了它因为用户有默认的用户身份验证保护。但是,重定向循环错误发生在
/admin/login
上,并且
/admin
已为所有访问打开。@M.Ko,对不起,我的错,中间件应该是
来宾:admin
。我已经更新了我的答案。如果经过验证的是路径
guest
中间件不是全局的,请检查
app/HTTP/Kernel.php
。同时看看你链接的教程底部的评论。你的评论启发了我。千万不要注意到
RedirectIfAuthenticated
中间件是通过
guest
关键字映射的。是的,这是一个常见的错误概念,它实际上是在做什么。RedirectIfAuthenticated,这个名称是误导性的。