【问题标题】:Laravel redirection error when setting up multiple authentication guard设置多个身份验证保护时 Laravel 重定向错误
【发布时间】:2020-01-07 01:33:34
【问题描述】:

我已按照本教程中的说明设置了管理员身份验证防护: Laravel Multiple Auth Tutorial
路线

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

RedirectIfAuthenticated 中间件

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

异常处理程序

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 路由成功注销。问题似乎是RedirectIfAuthenticated 中间件的原因。我错过了什么吗?

【问题讨论】:

  • RedirectIfAuthenticated 是路由guest 中间件不是全局的,请检查app/HTTP/Kernel.php。另请查看您链接的教程底部的评论。
  • 你的评论启发了我。永远不要注意到RedirectIfAuthenticated 中间件是由guest 关键字映射的。
  • 是的,对于 RedirectIfAuthenticated 的真正作用是一种常见的误解,这个名称具有误导性。

标签: php laravel authentication routes


【解决方案1】:

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

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

您想要的是将guest:admin 中间件应用于除indexlogout 函数之外的所有函数:

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

【讨论】:

  • 我申请了如下$this->middleware('auth:admin', ['except' => ['index', 'logout']]);,因为有一个默认的用户身份验证保护。但是,/admin/login 上发生了重定向循环错误,并且 /admin 已为所有访问打开。
  • @M.Ko,对不起,中间件应该是guest:admin。我已经更新了上面的答案
猜你喜欢
  • 2016-04-02
  • 2016-06-03
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 2021-11-27
  • 2015-11-11
  • 1970-01-01
  • 2019-02-19
相关资源
最近更新 更多