cacheKey((int) $user->getKey()), now()->getTimestampMs(), now()->addMinutes(max(1, (int) config('session.lifetime', 120)) + 5), ); } /** * Listener für `Login`: Zeitpunkt der Anmeldung in der Session. * Die Methode heißt bewusst nicht `handle*` (Event-Discovery). */ public function stampLogin(Login $event): void { if (! app()->bound('request') || ! request()->hasSession()) { return; } request()->session()->put(self::SESSION_KEY, now()->getTimestampMs()); } /** * Session stammt aus der Zeit vor der letzten Sperre dieses Kontos. * Ohne Anmeldezeitpunkt (Session von vor dem Deploy) gilt sie als alt. */ public function isRevoked(int $userId, Session $session): bool { $revokedAt = Cache::get($this->cacheKey($userId)); if ($revokedAt === null) { return false; } return (int) $session->get(self::SESSION_KEY, 0) < (int) $revokedAt; } private function cacheKey(int $userId): string { return 'auth.sessions-revoked-at.'.$userId; } }