强制注销Laravel中的所有用户

时间:2018-11-28 20:37:21

标签: php laravel laravel-5 vue.js artisan

如何强制所有用户退出SPA?我希望这样做,以便在部署新版本时,所有用户都自动注销。

我尝试了以下方法,但是我不确定这是否是最安全的方法。

php artisan key:generate

7 个答案:

答案 0 :(得分:0)

您可以销毁所有会话。如果使用Laravel Envoy处理部署,则可以添加以下行:

rm -rf storage/framework/sessions/*

如果您正在使用数据库会话驱动程序,则清除会话表很容易:

DB::table('sessions')->truncate();

答案 1 :(得分:0)

如果会话数据存储在数据库中,则需要清除sessions表。运行简单的SQL查询将解决问题:

DELETE FROM sessions;

如果会话存储在文件中,则如@Karl建议的那样,您需要从文件系统中删除会话文件:

rm -rf storage/framework/sessions/*

还可以更改会话cookie的名称,以强制所有会话无效,但这是代码更改,而不是清除数据。可以在cookie文件中的config/session.php键中更新名称。不建议使用此选项。

答案 2 :(得分:0)

这实际上取决于您选择的会话驱动器。

  • 如果使用文件驱动器,则可以删除存储/框架/会话 路径
  • 如果您使用数据库驱动器,则可以删除会话的所有行 桌子,

对于其他任何驱动器,您都可以像其他驱动器一样做到。

您还可以在app / session.php中更改cookie值,由于cookie与配置不匹配,因此用户将自动注销

  

值得注意的是,Laravel实际上仅将活动会话存储在   会话文件夹;那些“被记住”但尚未被   主动访问您的应用程序不计入这些会话中。   因此,仅删除文件将无法完成工作。

     

还必须清除用户表中的所有“记住令牌”,因为这   令牌与存储在cookie中的本地令牌结合使用   在用户重新连接时重新创建会话。

答案 3 :(得分:0)

如您所见,SessionGuard做一些事情,并且与您在环境中设置的SESSION_DRIVER类型无关。

因此,在阅读了与Taylor和其他Laravel重量级人物在论坛上进行的一些讨论之后,为什么没有这样一个简单的功能,也许最好的解决方案是创建一个部署后的Job或{ {1}},您可以运行该命令,这将简单地循环所有用户,因此无论设置了什么Session。我会尝试:

Command

答案 4 :(得分:0)

如果使用的驱动程序是文件,我想分享另一种实现方法。

这是“纯”的php方式,因此它可能是一个辅助工具“ flush_sessions()”:

$sessions = glob(storage_path("framework/sessions/*"));
foreach($sessions as $file){
  if(is_file($file))
    unlink($file);
}

使用此功能安全吗? PHP将隐藏文件保留在给定目录(.gitignore)内...因此,尝试一下是安全的。

值得一提的是,如果将其放在控制器方法中,则删除文件后将恢复您的会话(显然,Laravel将在请求结束后尝试更新文件,如果它不存在,将重新创建它)。但是所有其他会话(用户)将被注销。例如,如果您在php artisan tinker中运行此代码,则不会保留您自己的会话文件(因为artisan使用“ array”驱动程序运行)。

但是,在我看来,这很有用。例如:如果管理员用户要注销除他本人以外的所有用户。

例如: 您有两个会话:

Two sessions

运行该功能后,您只有一个(使用它的用户): One session

我希望这对某人有帮助。

答案 5 :(得分:0)

//要注销特定用户:

//$id == user id to to whom you want to logout
\DB::table('users')->where('id', $id)->update(['remember_token' => null]);
\DB::table('sessions')->where('user_id', $id)->delete();

//要注销所有用户

$sessions = glob(storage_path("framework/sessions/*"));
foreach ($sessions as $file) {
if (is_file($file))
unlink($file);
}
//$id == user id to to whom you want to logout
\DB::table('users')->update(['remember_token' => null]);
\DB::table('sessions')->truncate();

如果您不使用数据库作为会话驱动程序,则无需使用会话表操作。

答案 6 :(得分:0)

我正在将所有用户的记忆令牌更新为空白,然后刷新存储的会话,然后修改 HomeController。

     \DB::table('users')->update(array(
    'remember_token' => '',
    'logout_at' => Carbon::now()->toDateTimeString()));
    Session::flush();

然后在 HomeController 中修改索引函数

    public function index()
{
    if (Auth::check()) {
        $token = Auth::user()->remember_token;
        if ($token) {
            return view('home');
        } else {
            return redirect('/logout');
        }
    } else {
        return view('home');
    }
    
}