CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
4.4 KiB
4.4 KiB
SHL-02 – Prüfprotokoll (Zentrales Portal)
Datum: 2026-09-26. Host: Entwicklungshost 192.168.1.204, frischer Klon von main (Head 30cd3572).
Umsetzung
- Neue App
web/portal(Next.js/React/TS +@nexarch/shl). - Modul-Registry als reine Konfigurationsdatei
web/portal/config/modules.json(Name, Beschreibung, Link, benötigte RBAC-Permission je Modul) — kein hartcodierter Modul-Code (Akzeptanzkriterium 3). - Sichtbarkeit:
app/api/visible-modules/route.ts(Backend-for-Frontend, hält daspolicy-api-Dienst-Token serverseitig) ruft für jeden Registry-EintragPOST /authorizebeim bestehenden Core-policy-apiauf (internal/policyapi/internal/policy/module_scope.go,AuthorizeRequest) — Core entscheidet über RBAC-Rolle UND Mandanten-Feature-Flag in einem einzigen, bereits existierenden Aufruf; das Portal trifft keine eigene zweite Entscheidung (Akzeptanzkriterium 2). - Authentifizierung: bestehendes
createSession/redirectToLoginaus@nexarch/shl(UX-10), dieselbe Cookie-→Modul-Token-Sitzung wie beidms-upload/dms-browser/pdf-viewer— keine neue Auth-Architektur. - Kernlogik (
filterVisibleModules) als reine, injizierbare Funktion extrahiert, damit Akzeptanzkriterium 2/3 ohne echtenpolicy-api-Server unit-testbar sind.
Akzeptanzkriterien — Ergebnis
- Nach Anmeldung Kachel-Übersicht je sichtbarem Modul: erfüllt, real im Browser geprüft (siehe Prüfung 1).
- Sichtbarkeit hängt von Mandanten-Feature-Flag UND Nutzerrolle ab, nicht von einer statischen Frontend-Liste: erfüllt,
POST /authorizeist die alleinige Entscheidungsquelle. - Neues Modul ohne Portal-Code-Änderung: erfüllt, siehe Prüfung 2.
- Barrierefreie, mobilfreundliche Oberfläche (WCAG 2.1 AA): erfüllt, siehe Prüfung 3.
Prüfungen — Ergebnis
- Zwei Testnutzer mit unterschiedlichen Rechten sehen unterschiedliche Kacheln. Real durchgeführt in zwei Schichten:
- Unit-Test (
app/api/visible-modules/route.test.ts):role=userliefert 5 Module,role=tenant_adminliefert zusätzlichtenant_admin(6 Module) — bestanden. - Echter Browser-Test (Chrome stable + Puppeteer, Host 204): Fixture-Server (
/root/shl02-work/fixture/server.mjs, mockcore+policy-api) simulierte einen echtencreateSession-Ablauf (Cookie→Modul-Token, CORS). Mit Rolleusererschienen 5 Kacheln, "Mandantenverwaltung" fehlte vollständig aus dem DOM. Nach Umstellen der Fixture-Standardrolle auftenant_adminund Neuladen erschien die Kachel "Mandantenverwaltung" zusätzlich — ADMIN-KACHEL SICHTBAR bestätigt perpage.evaluate.
- Unit-Test (
- Neues Test-Modul nur über Konfiguration. Test
ein neues Modul per Konfigurationseintrag erscheint ohne Codeaenderunginroute.test.ts: ein synthetischer Registry-Eintrag (neues_testmodul) durchläuft exakt denselbenfilterVisibleModules-Code-Pfad wie die echten Module, ohne dass Rendering- oder Prüf-Code angepasst wurde — bestanden. - Echter Barrierefreiheits-Check (
pa11y --standard WCAG2AA, Chrome stable,/usr/bin/google-chrome-stable) gegen den laufenden Produktionsbuild (next start, Port 19803) mit echtem, sichtbarem Kachel-Inhalt: "No issues found!" - Kein Modul ohne Berechtigung sichtbar (negativer Zugriffstest). Strukturell erzwungen (nicht CSS):
filterVisibleModulesnimmt ein Modul nur in die zurückgegebene Liste auf, wennauthorize()trueliefert; Testlaesst kein Modul ohne Berechtigung durchundlaesst kein Modul durch wenn 'authorize' fehlschlaegt (fail-closed bei Ausfall)beide bestanden. Im echten Browser-Test war "Mandantenverwaltung" bei Rolleuserkomplett aus dem gerenderten HTML abwesend, nicht nur optisch verborgen.
Tests
npx vitest run: 10/10 grün (lib/modules.test.ts,app/api/visible-modules/route.test.ts— 7 Fälle inkl. der oben genannten,app/ModuleGrid.test.tsx).npx tsc --noEmit: sauber (nach dem bekannten Turbopack/@nexarch/shl-Symlink→Realkopie-Fix, wie bei APR-03/VOR-05/SUM-03/EXT-04).npx next build: erfolgreich (3 Routen:/,/_not-found,/api/visible-modules).
Nicht Bestandteil (wie in der Kachel festgelegt)
- Single-Sign-On zwischen den Modul-Apps selbst
- Umbau der bestehenden Modul-Apps
- Cross-Modul-Volltextsuche
Nebenbefund
Ein 404 auf favicon.ico im Browser-Konsolen-Log — kein App-Fehler, keine fehlende Ressource für die Kernfunktion, nicht behoben (außerhalb des Tickets).