Inaktivitäts-Logout mit Restzeit-Anzeige und Vorwarnung #35

Merged
DasAoD merged 1 commit from feature/session-idle-timeout into main 2026-09-06 11:56:01 +02:00
Owner

Was

Automatischer Logout nach 60 Minuten Inaktivität, mit sichtbarem Countdown in der Navbar und einer Warnung in der letzten Minute.

Verhalten

  • Timer-Anzeige neben "Angemeldet als: …" in der Navbar (⏳ MM:SS), wird bei jeder echten Aktion zurückgesetzt.
  • Als Aktivität zählen nur echte Aktionen: Seitenaufrufe, AJAX-Calls, Klicks, Tastendruck, Tap. Reines Mausbewegen/Scrollen verlängert nicht.
  • Letzte 60 Sekunden: modaler Dialog "Bald abgemeldet – Du wirst wegen Inaktivität in MM:SS abgemeldet." mit Button "Angemeldet bleiben". Der Timer-Chip pulst rot.
  • Timer abgelaufen: Redirect auf /login.php?expired=1 mit Hinweis "Du wurdest wegen Inaktivität abgemeldet."
  • Serverseitig wird die Session bei Überschreitung in auth.php zerstört – unabhängig vom Frontend.
  • Hintergrund-Tabs werfen keine Warnung/Redirect; beim Zurückwechseln wird sofort mit dem Server abgeglichen (Aktivität in einem anderen Tab hält alle Tabs am Leben).

Änderungen

Datei Zweck
includes/auth.php SESSION_IDLE_TIMEOUT (3600s) / SESSION_IDLE_WARNING (60s); last_activity-Prüfung bei jedem Include, Logout bei Überschreitung; login() setzt last_activity
api/session_status.php neu – reiner Poll für die Restzeit, verlängert die Session nicht (SESSION_SKIP_ACTIVITY_TOUCH)
api/session_extend.php neu – verlängert die Session bei echter Client-Aktivität ohne Seitenwechsel
public/assets/js/session-timeout.js neu – Countdown, Warndialog, Aktivitätserkennung (Klick/Taste/Tap), 45s-Serverabgleich, Redirect
includes/template.php Timer-<span> in der Navbar; window.SF_SESSION-Config + Script-Einbindung nur für eingeloggte User; CSS/JS-Version gebumpt
public/assets/css/main.css Styles für .session-timer (+ Warn-Puls) und .session-warning-count
public/login.php Hinweis bei ?expired=1

Konfiguration

Timeout/Vorwarnzeit sind zwei Konstanten oben in includes/auth.php.

Test

Lokal kein PHP verfügbar – nur manuelles Review. Bitte auf dns1 gegenprüfen:

  • Countdown läuft, Reset bei Klick/Tastendruck
  • Warndialog bei < 60s, "Angemeldet bleiben" verlängert
  • nach Ablauf Redirect + Hinweis auf der Login-Seite
  • API-Endpunkte liefern authenticated/remaining

🤖 Generated with Claude Code

## Was Automatischer Logout nach **60 Minuten Inaktivität**, mit sichtbarem Countdown in der Navbar und einer Warnung in der letzten Minute. ## Verhalten - **Timer-Anzeige** neben "Angemeldet als: …" in der Navbar (`⏳ MM:SS`), wird bei jeder echten Aktion zurückgesetzt. - **Als Aktivität zählen** nur echte Aktionen: Seitenaufrufe, AJAX-Calls, Klicks, Tastendruck, Tap. Reines Mausbewegen/Scrollen verlängert **nicht**. - **Letzte 60 Sekunden**: modaler Dialog "Bald abgemeldet – Du wirst wegen Inaktivität in `MM:SS` abgemeldet." mit Button **"Angemeldet bleiben"**. Der Timer-Chip pulst rot. - **Timer abgelaufen**: Redirect auf `/login.php?expired=1` mit Hinweis "Du wurdest wegen Inaktivität abgemeldet." - Serverseitig wird die Session bei Überschreitung in `auth.php` zerstört – unabhängig vom Frontend. - Hintergrund-Tabs werfen keine Warnung/Redirect; beim Zurückwechseln wird sofort mit dem Server abgeglichen (Aktivität in einem anderen Tab hält alle Tabs am Leben). ## Änderungen | Datei | Zweck | |---|---| | `includes/auth.php` | `SESSION_IDLE_TIMEOUT` (3600s) / `SESSION_IDLE_WARNING` (60s); `last_activity`-Prüfung bei jedem Include, Logout bei Überschreitung; `login()` setzt `last_activity` | | `api/session_status.php` | **neu** – reiner Poll für die Restzeit, verlängert die Session **nicht** (`SESSION_SKIP_ACTIVITY_TOUCH`) | | `api/session_extend.php` | **neu** – verlängert die Session bei echter Client-Aktivität ohne Seitenwechsel | | `public/assets/js/session-timeout.js` | **neu** – Countdown, Warndialog, Aktivitätserkennung (Klick/Taste/Tap), 45s-Serverabgleich, Redirect | | `includes/template.php` | Timer-`<span>` in der Navbar; `window.SF_SESSION`-Config + Script-Einbindung nur für eingeloggte User; CSS/JS-Version gebumpt | | `public/assets/css/main.css` | Styles für `.session-timer` (+ Warn-Puls) und `.session-warning-count` | | `public/login.php` | Hinweis bei `?expired=1` | ## Konfiguration Timeout/Vorwarnzeit sind zwei Konstanten oben in `includes/auth.php`. ## Test Lokal kein PHP verfügbar – nur manuelles Review. Bitte auf dns1 gegenprüfen: - Countdown läuft, Reset bei Klick/Tastendruck - Warndialog bei < 60s, "Angemeldet bleiben" verlängert - nach Ablauf Redirect + Hinweis auf der Login-Seite - API-Endpunkte liefern `authenticated`/`remaining` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
- auth.php enforces a 60-minute idle timeout via $_SESSION['last_activity']; only "real actions" (page loads, AJAX, clicks, keypresses) refresh it, and it destroys the session once exceeded
- new api/session_status.php (read-only, never refreshes the timer) and api/session_extend.php (refreshes on real client-side activity)
- session-timeout.js shows the remaining time next to the username, opens a "logging out in <60s" dialog with a "stay logged in" button, and redirects to /login.php?expired=1 when the timer runs out
- login.php shows an "logged out due to inactivity" notice on ?expired=1; CSS for the navbar timer + warning pulse

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
DasAoD merged commit 9fdb9c5b3b into main 2026-09-06 11:56:01 +02:00
Sign in to join this conversation.
No description provided.