Aktuelle Datenhaltung über VIN #5
Labels
No labels
blocked
claude
in-progress
needs-review
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
aiways/Backend#5
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Derzeit hängen die Daten an der VIN, aber weniger am Benutzer. Ich halte das für problematisch. Sollte irgendwann mal ein Auto seinen Besitzer wechseln, dann würde ja die gesamte Historie der Daten an den neuen User übergehen? Ich denke, die Datensätze sollten an einer Kombi von Benutzer + VIN hängen (falls das noch nicht der fall sein sollte).
Ein Standard-API-KEY mit user rolle sollte dann natürlich auch nur seine eigenen Daten über das Backend abfragen können.
Umgesetzt in
85b1d67(release) — CI grün, deployt, live verifiziert.Du hast recht gehabt, und zwar an der wunden Stelle: bisher hing die Telemetrie nur an der VIN, und jeder eingeloggte Nutzer sah jedes Fahrzeug. Ein API-Key mit Rolle
userebenso.Eigentum ist jetzt ein Zeitraum, kein Flag
Der entscheidende Punkt ist der, den du selbst genannt hast — beim Besitzerwechsel darf die Historie nicht mitwandern. Eine Spalte
vehicles.owner_idhätte genau das getan. Stattdessen gibt esvehicle_ownersmit einer Kette halboffener Intervalle[from_ts, to_ts):Ein Nutzer sieht einen Record genau dann, wenn dessen
tsin eines seiner Intervalle fällt. Verkauft Alice das Auto an Bob, behält Alice ihre Fahrten und Bob fängt bei null an.GET /vehicles/:id/ownersPOST /vehicles/:id/owner{userId, at?}— nur AdminIm Dashboard steckt das unter Fahrzeuge → Halter: Historie als Tabelle, und als Admin ein Formular „Neuer Halter / ab / Halterwechsel eintragen".
API-Keys: eine Lücke, die dabei aufgefallen ist
Schlüssel dürfen nur Admins anlegen, und
created_bywar der ausstellende Admin — ein Key mit Rolleuserhätte also die Reichweite des Admins geerbt. Damit wäre dein zweiter Punkt nicht erfüllt gewesen.api_keys.owner_idtrennt das jetzt:created_bybleibt Revisionsspur,owner_idsagt, für wen der Schlüssel handelt. Bei der Erstellung:Mit abgesichert: die Command-Queue
Nicht ausdrücklich gefordert, aber dieselbe Lücke und schwerer als Lesen — ein fremder Nutzer konnte Befehle an dein Auto einreihen.
POST /commandsgeht jetzt nur noch auf eigene Fahrzeuge,GET /commandszeigt nur eigene,GET /commands/:idgibt fremde nicht heraus. Befehle ohne Fahrzeug (global) sind Admins vorbehalten.Fremdes liefert überall 404, nicht 403 — sonst verrät schon die Fehlermeldung, dass es eine Fahrzeug-ID gibt.
Sichtbarkeit auf einen Blick
adminuseradminuseruserId, sonst der ausstellende Admin)Entscheidungen (proceed-with-default)
-infinity. Damit wird durch die Umstellung keine vorhandene Telemetrie unsichtbar — auf deiner Instanz ändert sich für dich also nichts. Willst du Fahrzeuge auf konkrete Konten verteilen, geht das über die Halter-UI.DEVICE_TOKENden dienstältesten Admin. Sonst wäre ein frisch hochgeladenes Auto für jeden Nicht-Admin unsichtbar./vehicles— sonst käme er an seine eigene Historie nicht mehr heran. Er sieht davon aber nur seinen Zeitraum.Verifikation (echte Postgres-Instanz, Produktivschema, 360 Tage Telemetrie)
Szenario: Alice ab 01.01., Verkauf an Bob am 01.07.
latest: Alice bekommt ihren letzten Record vom 30.06., Bob den vom 26.12./vehiclesleer,timeseries/latest/ownersund der Zugriff über die VIN je 404.DEVICE_TOKEN→ gehört Admin./healthok, alle neuen Routen antworten mit 401 statt 404 (existieren also), Dashboard und Sandbox-Doku auf neuem Stand. Der Container startet nur nach erfolgreichemnpm run migrate— die Migration ist auf deiner Instanz also durch.Eine Sache, die du prüfen solltest
Admins sehen weiterhin alles, unabhängig vom Eigentum. Hat eines deiner beiden Konten die Rolle
user, sieht es ab jetzt nur noch Fahrzeuge, die ihm ausdrücklich zugeordnet sind — und der Backfill hat alles dem Admin gegeben. Falls dieses Konto etwas sehen soll, trag es einmal über Fahrzeuge → Halter als Halter ein. Bei zwei Admin-Konten ändert sich für dich gar nichts.Ja in unser Admin Web Dashboard sollten sich sowieso nur Admins anmelden können, keine User! Die bekommen ja noch ihre eigene App mit ihrer eigenen Ansicht und funktionalität
Umgesetzt in
3e6e011(release) — CI grün, deployt, live verifiziert.Wer sich ohne Admin-Rolle anmeldet, bekommt jetzt „Dieses Dashboard ist Administratoren vorbehalten" und kommt nicht hinein. Das Token wird dabei gar nicht erst im Browser abgelegt — sonst hinge dort eine tote Sitzung. Beim Wiederherstellen einer Sitzung wird die Rolle erneut geprüft, falls ein Konto zwischenzeitlich heruntergestuft wurde. Unter dem Login steht jetzt „Admin-Oberfläche".
/auth/loginbleibt bewusst offen für alle Rollen — die Nutzer-App wird sich über denselben Endpunkt anmelden, ein 403 dort hätte sie von vornherein ausgesperrt. Die Abweisung ist eine Frage der Oberfläche, nicht der Sicherheit: die Daten-Endpunkte prüfen Rolle und Eigentum ohnehin jeder für sich (die Verifikation dazu steht im vorigen Kommentar). Selbst wenn jemand das Gate im Browser umginge, bekäme er nur das, was ihm nach #5 zusteht.Den Hinweis im Fahrzeuge-Tab habe ich passend gedreht: „Als Admin siehst du alle Fahrzeuge. Nutzer sehen in ihrer App nur die eigenen."
Verifikation
user-Konto: der Admin kommt durch, das Nutzer-Konto wird abgewiesen — die Prüffunktion aus dem ausgelieferten Dashboard direkt gegen die echten Login-Antworten laufen lassen, nicht nachgebaut./healthok, Admin-Gate im ausgelieferten Dashboard vorhanden, Client-JS parst sauber,/auth/loginantwortet auf falsche Zugangsdaten mit 401 (Route also offen).Wenn die Nutzer-App so weit ist und du dafür eigene Endpunkte brauchst, mach am besten ein neues Issue auf — die Sichtbarkeitsregeln aus #5 gelten dort dann automatisch.