M0: Skelett + Auth-Grundgerüst (Keycloak-OIDC + API-Token)

- Symfony 7.4 LTS, PHP 8.4, FrankenPHP, SQLite (3-Layer src/UI|Logic|Data)
- Auth: manueller OidcClient (Authorization-Code) im UI-Layer, kein
  Security-Bundle/league; Session-Gate via SessionAuthSubscriber
- API-Guard via statischem X-Api-Token (ApiTokenSubscriber); ExceptionSubscriber
- UserEntity (Auto-Provision) + Init-Migration
- Docker (php:8.4-frankenphp) + compose (essen.ljh31.de, traefik-net external)
- SmokeTests (7) grün: Redirect-Fälle, API-Token, Auth-Render, Logout

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-09-13 22:48:24 +02:00
co-authored by Claude Opus 4.8
parent 3c0bee5826
commit cb3cbfb394
56 changed files with 9596 additions and 19 deletions
+13
View File
@@ -0,0 +1,13 @@
# Referenzwerte für die Produktion (docker1: /root/stacks/svc-essensplanung/.env,
# als env_file über compose gemountet – siehe Doku/plan.md M5).
# Lokale Entwicklung nutzt stattdessen .env (var/data.db).
APP_ENV=prod
APP_DEBUG=0
APP_SECRET=<random-64-hex>
DATABASE_URL=sqlite:////data/essens.db
KEYCLOAK_ISSUER=https://iam.ljh31.de/realms/family
KEYCLOAK_CLIENT_ID=essens
KEYCLOAK_CLIENT_SECRET=<keycloak-client-secret>
KEYCLOAK_REDIRECT_URI=https://essen.ljh31.de/auth/callback
API_TOKEN=<generierter-statischer-token>
# (API_TOKEN leer = /api/* ohne Zugriff; HA-Consumer bekommt den Token)