„Was ist eigentlich mit meinem Notebook passiert?“ musste bisher ein Techniker nachsehen. Ein Mitarbeiter kann die Arbeiten an **seinen** Geraeten jetzt selbst ansehen — mit der fuenften Rolle MITARBEITER, zugeordnet beim Anmelden ueber den UPN. Was er sieht, sind Titel, Zeitraum und Status. Keine Schritte, keine Notizen, keine Kommentare, keine Anhaenge: in einem Lauf stehen Arbeitsnotizen ueber Menschen und Befehle mit Platzhaltern fuer Zugangsdaten. Eine Selbstauskunft ist keine Akteneinsicht, und das haelt nicht die Seite fest, sondern das Lesemodell — eine Seite, die filtert, ist eine Seite, die es vergessen kann. `selbstauskunft` ist ein **Ersatz** fuer `lesen` und kein Zusatz; auch ein ADMIN hat es nicht. Ein zweiter Weg zu denselben Daten waere eine zweite Stelle, an der jemand die Einschraenkung auf die eigene Person vergisst. Die Datenbank verlangt das sogar: ein CHECK haelt fest, dass Rolle und Zuordnung zusammengehoeren, in beide Richtungen. Ein mehrdeutiger UPN wird abgewiesen und protokolliert. Zwei Kunden koennen dieselbe Person fuehren; ein findFirst entschiede nach Sortierung darueber, wessen Geraete jemand sieht. **Verhaltensaenderung:** wer sich anmeldet und in keiner Rollengruppe steht, bekommt nicht mehr automatisch LESER — also nicht mehr Lesezugriff auf alle Laeufe des Hauses. Das greift nur mit konfigurierten OIDC_GROUP_*; ohne sie bleibt alles wie vorher, denn ohne abgebildete Gruppen laesst sich Techniker nicht von Mitarbeiter unterscheiden. Nebenbei behoben: `staerksteRolle` benutzte LESER als Startwert und damit als Untergrenze — mit einer Rolle darunter lieferte sie mehr Rechte als uebergeben. Gefunden von einem Test, der seit #007 unveraendert dasteht. Closes #55 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
7.9 KiB
7.9 KiB
#035 M22 – Mitarbeiter-Selbstauskunft
Status: erledigt Im Tracker: #55 Meilenstein: v0.2.0 Labels: phase-2, backend, frontend Geschätzt: 8 h Tatsächlich: 2 h 50 min
Ziel
„Was ist eigentlich mit meinem Notebook passiert?“ fragt heute jemand im Ticket, und ein Techniker sieht nach. Ein Mitarbeiter soll die Läufe zu seinen Geräten und zu seiner Person selbst ansehen können — nur lesend.
Woran es hängt
Ein Mitarbeiter ist kein Benutzer. Die Anwendung kennt vier Rollen für Leute, die arbeiten;
ein Mitarbeiter ist Gegenstand der Arbeit, nicht ihr Träger. Es gibt heute keinen Weg, von einer
Anmeldung zu einer Mitarbeiter-Zeile zu kommen.
Zu entscheiden
- Anmeldung über OIDC, Zuordnung über den UPN, neue Rolle
MITARBEITER— Empfehlung. Das Haus hat seine Leute ohnehin im Identitätsanbieter; wer sich anmeldet und keiner Rollengruppe angehört, wird überupneinerMitarbeiter-Zeile zugeordnet und bekommt genau ein Recht:selbstauskunft.Benutzer.mitarbeiterIdhält die Zuordnung fest. Die Alternative — ein Link mit Token je Person — braucht keine Anmeldung, aber jeder weitergeleitete Link ist dann ein Datenleck, und widerrufen müsste man je Person. - Was der Mitarbeiter sieht: Titel, Status, Zeitraum und Gerät eines Laufs. Nicht die Schritte, nicht die Notizen, nicht die Kommentare, nicht die Anhänge. In einem Lauf stehen Arbeitsnotizen über Menschen und Zugangsdaten-Platzhalter; eine Selbstauskunft ist keine Akteneinsicht. Das ist die wichtigste Entscheidung dieses Meilensteins und gehört in die Anleitung, nicht nur in den Code.
- Kein Zugang ohne Zuordnung. Wer sich anmeldet und zu keiner
Mitarbeiter-Zeile passt, bekommt/kein-zugriffmit Begründung — nicht eine leere Seite, die wie ein Fehler aussieht.
Aufgaben
RolleumMITARBEITERerweitern;RECHTEbekommtselbstauskunft: ["MITARBEITER", …]. Jede Rollenprüfung intests/rollen.test.tswächst um eine Spalte — die Matrix ist ausgeschrieben und nicht berechnet, genau damit das auffälltBenutzer.mitarbeiterIdmit Mandantengrenze als zusammengesetzter Fremdschlüssel- Zuordnung beim Login über
upn, unabhängig von Groß- und Kleinschreibung; mehrdeutig ist ein Fehler und kein Zufallstreffer - Eigene Seite
/meine-geraete: meine Geräte, je Gerät die Läufe chronologisch, Titel und Status - Jede Abfrage schränkt auf die eigene Person ein — nicht die Seite. Ein Lesemodell trägt seine Sicht selbst (CLAUDE.md)
- Die Navigation zeigt einem
MITARBEITERnur diese Seite; alles andere ist weg, nicht grau - Anleitung: ein eigenes kurzes Kapitel, an Mitarbeiter gerichtet und nicht an Techniker
Akzeptanzkriterien
- Test: ein
MITARBEITERsieht die Läufe seiner Geräte und keinen anderen - Test: er sieht keine Schritte, Notizen, Kommentare oder Anhänge — geprüft über die Antwort, nicht über die Seite
- Test: er kann nichts schreiben — jede Server Action weist ihn ab (
tests/zugang.test.tserkennt eine ungeprüfte Aktion ohnehin) - Test: ohne passende
Mitarbeiter-Zeile führt die Anmeldung auf/kein-zugriffmit Begründung - Test: ein mehrdeutiger UPN wird abgewiesen und protokolliert
- Test: die Rollenmatrix ist vollständig — jede der fünf Rollen gegen jedes Recht
- Am Handy kein horizontales Scrollen
Beim Umsetzen dazugekommen
- Kein zusammengesetzter Fremdschlüssel, und zwar aus einem Grund. Die Aufgabe verlangte
Benutzer.mitarbeiterId„mit Mandantengrenze als zusammengesetzter Fremdschlüssel“. Das geht nicht: einBenutzerträgt keinekundeId, gegen die man zusammensetzen könnte — ein Administrator sieht alle Kunden. Stattdessen hält die Datenbank das fest, was hier wirklich zählt: ein CHECK, dass Rolle und Zuordnung zusammengehören (in beide Richtungen), und ein eindeutiger Index, dass eine Person höchstens ein Konto hat. Die Zusage „sieht nur seine eigenen Läufe“ hängt an der einen Kennung, und stärker als ein Fremdschlüssel darauf wird sie nicht. - Nicht
/kein-zugriff, sondern die Anmeldeseite. Das Kriterium sah vor, dass eine Anmeldung ohne passende Person auf/kein-zugriffführt. Diese Seite verlangt aber eine Sitzung, und bei gescheiterter Anmeldung gibt es keine — sie würde auf die Anmeldeseite zurückleiten, also im Kreis. Die Begründung steht deshalb dort, mit zwei eigenen Fehlercodes (keine-person,upn-mehrdeutig). Der Geist des Kriteriums ist damit erfüllt: keine leere Seite, die wie ein Fehler aussieht. - Ein bestehender Test seit #007 fand eine echte Lücke.
staerksteRollebenutzteLESERals Startwert, und das war zugleich eine Untergrenze:staerksteRolle(["MITARBEITER"])ergabLESER, also mehr Rechte als übergeben. Solange alle Rollen mindestensLESERwaren, fiel das nie auf. Der Test „gibt bei nur diese Rolle zurück“ war sofort rot. - Jeder Navigationseintrag nennt jetzt sein Recht. Bis hierher stand
rechtnur am Admin-Bereich — das genügte, weil jede Rollelesendurfte. MitMITARBEITERstimmt das nicht mehr, und ohne diese Änderung hätte die Seitenleiste ihm sechs Links angeboten, die alle auf/kein-zugriffführen. - Zwei Bedienfehler beim Durchklicken gefunden, beide dieselbe Ursache: das Standardziel nach
der Anmeldung ist
/, und die Übersicht verlangtlesen. Ein Mitarbeiter sah als Erstes „Dafür fehlt dir die Berechtigung“ — und der Knopf auf jener Seite führte zurück auf/, also im Kreis. Beides behebtstartseite(rolle)insrc/server/auth/rollen.ts, an einer Stelle und mit Test. - Eine Gegenprobe blieb grün, und das war der Befund. Der Test „sieht keine Notizen“ prüft die
Antwort, und die ist sicher:
laufBauensetzt sie aus den erlaubten Feldern zusammen. Als ich imselectversuchsweiseergebnisse: { notiz }ergänzte, blieb er deshalb grün — während der Kopfkommentar der Datei behauptet, dasselecthole es „gar nicht erst“. Diese Behauptung hat jetzt ihren eigenen Test, der die Datei selbst liest. Einselect, das Notizen mitliest, zieht sie durch Protokolle und Fehlerberichte. selbstauskunfthat auch der ADMIN nicht. Es ist ein Ersatz fürlesen, kein Zusatz: ein zweiter Weg zu denselben Daten wäre eine zweite Stelle, an der jemand die Einschränkung auf die eigene Person vergisst. Wer beides braucht, braucht zwei Konten — und der CHECK verlangt das.- Der Rang von
MITARBEITERliegt unterLESER. Der Rang entscheidet, wer gewinnt, wenn jemand in mehreren abgebildeten Gruppen steht. Stünde er darüber, verlöre ein Techniker seine Rechte, weil er auch Mitarbeiter des Hauses ist. - Ein struktureller Test, dass keine Server Action
selbstauskunftverlangt. Die Zusage „kann nichts schreiben“ steht nicht in einer Prüfung, sondern in der Abwesenheit einer Aktion mit diesem Recht — und die muss jemand bewachen. - Die Weiche greift nur mit eingerichteter Gruppenzuordnung. Ohne abgebildete Gruppen kann die Anwendung nicht unterscheiden, ob jemand Techniker oder Mitarbeiter ist. Ein Update, das jeden aussperrt, dem die Gruppen fehlen, wäre ein kaputtes Update — mit eigenem Test.
- Die authentik-Doku enthielt jetzt einen falschen Satz: „Ist der Benutzer in keiner der vier
Gruppen, bekommt er
LESER.“ Richtiggestellt, mit einem eigenen Abschnitt zur Selbstauskunft und dem Hinweis, wie man das alte Verhalten behält. - Das Anleitungskapitel 09 ist an Mitarbeiter gerichtet, nicht an die IT — das erste Kapitel dieser Anleitung, das sich an jemanden außerhalb der IT wendet. Es lässt sich weitergeben, ohne den Rest mitzuschicken, und sagt ausdrücklich, warum man die Schritte nicht sieht.