Hoppa till innehållet

Konton för projektgruppen

Yta

Ger projektgruppen egna inloggningar, så att fler än projektledningen kan hålla att göra-listan aktuell och det går att se vem som ändrade vad – utan att vänta på SAML-sessionen.

källa: apps/projekt/src/konton, apps/projekt/src/app/(projekt)/konto, apps/projekt/src/app/(projekt)/kontonuppdaterad:

Ansvar

  • Logga in med användarnamn och lösenord på /konto och hålla en session i 90 dagar som förnyas när den används, högst en gång per dygn, med bara kakans fingeravtryck i databasen (ADR-039).
  • Låta admin skapa konton på /konton med ett engångslösenord som visas en gång, ge nya engångslösenord, byta roll och stänga eller öppna konton. Ett konto tas aldrig bort. Det första kontot skapas med skrivnyckeln, bara när inga konton finns.
  • Tvinga fram ett eget lösenord vid första inloggningen, inom sju dagar, och spara lösenord bara som scrypt med eget salt och OWASP:s parametrar. Avvisa vanliga lösenord.
  • Spärra gissningar per adress och per konto: tio fel i rad spärrar kontot en kvart, med samma svar som fel lösenord.
  • Säga vem som är inloggad och om kontot får skriva – skrivare(), admin() och kravKonto() för server actions och sidor – och visa kontot i toppradens övre högra hörn, med vägen till kontot och för admin till kontona – och Logga in på samma plats för den som inte är inloggad.
  • Logga varje ändring på ett konto i ändringsloggen som källan konton, med vem i av och utan namn i texten.

Filer

Tabell: Sökväg, Roll
SökvägRoll
apps/projekt/src/projektyta/Kontomeny.tsxKontomenyn i toppraden för den som är inloggad; admin får också Konton. LoggaIn på samma plats för den som inte är det, med vidare= till sidan man står på; visas inte på /konto.
konton/regler.tsKonto, rollerna, provaKonto (zod, strikt), farSkriva, lösenordens längd och namnen: initialer, fornamn och arAnsvarig. Ren logik, också för formulären.
konton/losenord.tshashaLosenord och stammer med scrypt ur node:crypto (N=2^15, r=8, p=3), provaLosenord, engangslosenord och ett atrappavtryck för användarnamn som inte finns.
konton/vanliga.tsarVanligt: vanliga lösenord, jämförda på stammen utan siffror och tecken, och tecken i följd. Ingen extern tjänst.
konton/databas.tsTabellerna konton och sessioner i startsidans databas (steg 4 och 5 i databas/databas.ts): engångslösenordets giltighet och felaktiga försök per konto. Städar utgångna sessioner när en ny skapas.
konton/server.tsinloggad, skrivare, admin, loggaIn, loggaUt, bytLosenord, skapaForstaKontot, skapaKonto, aterstallLosenord, satKontoAktivt, bytRoll och namnPaKonton. Servern fattar besluten och loggar.
konton/actions.tsServer actions bakom formulären. Spärren mot felaktiga försök delas med skrivnyckeln och koderna (atkomst/felforsok.ts).
konton/konton.test.tsLösenorden, vanliga lösenord, reglerna och hela kedjan mot en tillfällig databas: första kontot, engångslösenord och när det går ut, spärren per konto, byte, utloggning av andra sessioner, stängning och loggen.
app/(projekt)/konto/page.tsxInloggningen, med vidare= tillbaka dit man kom ifrån. Inloggad: ikonen, välkomsten och rollen överst.
app/(projekt)/konto/Inloggad.tsxKontosidan för den inloggade: att göra-listan först, med öppna uppgifter per läge och de egna (ansvarig = förnamnet), sedan sidorna bara inloggade når och sist kontot – Byt lösenord, Konton för admin och Logga ut.
app/(projekt)/konto/losenord/page.tsxByt lösenord – första gången från engångslösenordet.
app/(projekt)/konto/Formular.tsxFormulären: inloggning, lösenordsbyte, första kontot, nytt konto och åtgärderna per konto. Klient bara för att visa serverns svar – felen intill fälten – och engångslösenordet en gång. Ett nytt engångslösenord kräver en bekräftelse.
app/(projekt)/konton/page.tsxKontona för admin: tabellen med roll, läge och senaste inloggning, och Nytt konto. Utan konton: det första, med skrivnyckeln.

API

Tabell: Namn, Signatur, Beskrivning
NamnSignaturBeskrivning
skrivare() => Promise<Konto | undefined>Kontot bakom kakan om det är öppet och har ett eget lösenord. Det en server action frågar innan den skriver.
admin() => Promise<Konto | undefined>Som skrivare, men bara för rollen admin.
inloggad() => Promise<Konto | undefined>Kontot bakom kakan, också ett som måste byta lösenord. För att visa, inte för att skriva.
namnPaKonton() => Map<string, string>Användarnamn till namn, för att visa vem i ändringsloggen. Ges bara till den som är inloggad.

Kontrakt

Tabell: Fält, Typ, Krav
FältTypKrav
idstringAnvändarnamnet: 2–32 tecken, a–z, siffror, punkt och bindestreck, börjar med en bokstav. Ändras aldrig.
namnstringDet som visas när kontot har ändrat något.
roll"medlem" | "admin"Admin skapar och stänger konton. Det finns alltid minst en öppen admin.
masteBytabooleanSant med ett engångslösenord. Kontot får inte skriva förrän ett eget har valts.
engangsUtgarstring?När engångslösenordet slutar gälla, sju dagar efter att det gavs.
sparradTillstring?Satt efter tio felaktiga försök i rad, en kvart fram. Ett nytt engångslösenord häver den.
aktivbooleanEtt stängt konto loggas ut överallt och kan inte logga in. Det tas aldrig bort.
skapad, andrad, senastInloggadstringISO-tid, satt av servern.
  • En ny yta som ska kräva konto frågar skrivare() i varje server action och skickar konto.id som av till logga. Ett formulär eller en dold knapp är aldrig behörigheten.
  • Åtkomstkoden är fortfarande ingen identitet (ADR-012). Bygg ingenting på den – och inget här ska överleva SAML-sessionen i fas 4 annat än att av pekar på en person.
  • Engångslösenordet visas bara i svaret på åtgärden, aldrig i en adress eller en logg.

Beroenden och beslut

Beslut: ADR-039, ADR-012, ADR-037

Levererar: /konto, /konto/losenord, /konton, konton/, Vem som ändrade i att göra-listan och på /andringar

Kvarstår

  • Bara att göra-listan använder kontona för att skriva. Statusrapporterna och funktionerna har kvar skrivnyckeln på sidan.
  • Ingen tvåfaktorsinloggning och ingen e-post: admin lämnar engångslösenordet själv.
  • Spärren per adress ligger i minnet och nollställs vid omstart; spärren per konto ligger i databasen.
  • Listan med vanliga lösenord är kort och egen. Ingen kontroll mot läckta lösenord i en extern tjänst.
  • Ersätts av SAML-sessionen i fas 4.

15 delar i projektportalen · gemensamma i devportalen: ai-adapter, anthropic, bygge, designsystem, dokploy, dokumentation, gemensamt, tokens, ui