首页 > 解决方案 > 如何使用一种方法注销任何警卫?

问题描述

我目前有一种方法可以用来注销任何 sessons/guards,问题是我必须定义每个目前都可以的方法,因为只有两个。

我想知道是否有办法让这更简单(除了破坏所有会话数据)。

Route::get('/logout', function () {
    Auth::logout();
    Auth::guard('business_user')->logout();
    return redirect()->route('home');
})->name('user.logout');

标签: laravel

解决方案


在网络调用之间重置身份验证管理器时,我在我的测试套件中做了类似的事情。您从配置文件中获取已定义的守卫列表,然后遍历这些守卫并调用logout()支持该logout()方法的守卫。代码中的注释。

Route::get('/logout', function () {
    // Get a list of all of the defined guards.
    $guards = array_keys(config('auth.guards'));

    // Loop through each guard and logout.
    foreach ($guards as $guard) {
        $guard = app('auth')->guard($guard);

        // Not all guard types have a logout method. The SessionGuard (web) does,
        // the TokenGuard (api) does not. Only call the method if it exists
        // on the guard.
        if (method_exists($guard, 'logout')) {
            $guard->logout();
        }
    }

    return redirect()->route('home');
})->name('user.logout');

推荐阅读