如何强制所有用户退出SPA?我希望这样做,以便在部署新版本时,所有用户都自动注销。
我尝试了以下方法,但是我不确定这是否是最安全的方法。
php artisan key:generate
答案 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”驱动程序运行)。
但是,在我看来,这很有用。例如:如果管理员用户要注销除他本人以外的所有用户。
例如: 您有两个会话:
我希望这对某人有帮助。
答案 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');
}
}