Sesi login: lifetime 5 menit + sesi kadaluarsa dianggap mati

- SESSION_LIFETIME=5 di .env (sebelumnya 120 menit idle)
- User::sessionTokenIsAlive() kini cek umur sesi (file mtime / DB last_activity)
  vs masa hidup, bukan sekadar ada/tidaknya file — user yang sesinya habis
  langsung bisa login lagi tanpa nunggu GC atau Paksa Logout
- 2 test baru (sesi kadaluarsa → boleh login; sesi fresh → tetap terkunci)
This commit is contained in:
Novy San87
2026-08-03 14:11:00 +07:00
parent 02a5c6d701
commit 8e625f86e0
2 changed files with 68 additions and 2 deletions
+24 -2
View File
@@ -152,7 +152,10 @@ class User extends Authenticatable
}
/**
* Cek apakah token sesi aktif masih "hidup" (session file/DB masih ada).
* Cek apakah token sesi aktif masih "hidup".
* Sesi dianggap hidup hanya jika file/row masih ada DAN belum lewat masa
* hidup (session.lifetime). Sesi yang sudah kadaluarsa dianggap mati,
* sehingga user bebas login lagi di perangkat mana pun.
* Driver array/lain → dianggap hidup (aman, tolak login ganda).
*/
public function sessionTokenIsAlive(): bool
@@ -162,12 +165,31 @@ class User extends Authenticatable
return false;
}
$lifetimeSeconds = (int) config('session.lifetime') * 60;
return match (config('session.driver')) {
'file' => file_exists(storage_path('framework/sessions/'.$token)),
'file' => $this->fileSessionIsAlive($token, $lifetimeSeconds),
'database' => \Illuminate\Support\Facades\DB::table(config('session.table', 'sessions'))
->where('id', $token)
->where('last_activity', '>=', time() - $lifetimeSeconds)
->exists(),
default => true,
};
}
/**
* Cek sesi berbasis file: file ada DAN aktivitas terakhir (mtime) masih
* dalam masa hidup. Laravel menulis ulang file sesi di setiap request,
* jadi mtime = aktivitas terakhir user.
*/
protected function fileSessionIsAlive(string $token, int $lifetimeSeconds): bool
{
$path = storage_path('framework/sessions/'.$token);
if (! is_file($path)) {
return false;
}
return (time() - (int) filemtime($path)) <= $lifetimeSeconds;
}
}