Sikkerhet - aTrueYety/idatt2106-2025-09-backend GitHub Wiki

Sikkerhet

Denne siden beskriver sikkerhetsarkitekturen og praksisene som er brukt i systemet. Applikasjonen benytter moderne autentisering med JWT, autorisering basert på roller, inputvalidering, sikker e-posthåndtering og beskyttelse mot vanlige sikkerhetstrusler.


Autentisering og Autentiseringsflyt

Autentisering implementeres via Spring Security med BCryptPasswordEncoder og JWT-token.

Register & Login

  • Brukere kan registrere seg med gyldig e-post, unikt brukernavn og sterkt passord.
  • Login validerer passord og returnerer JWT-token med følgende claims:
    • username
    • userId
    • isAdmin
    • isSuperAdmin

Token-generering og validering

Token signeres med HMAC SHA-256 via JwtService. Tokenverifisering skjer i JwtAuthenticationFilter og WebSocket-interceptor.


Autentisering over WebSocket

WebSocket-endepunktet /ws støtter JWT-beskyttet tilkobling:

  • Token sendes som URL-parameter /ws?token=<jwt>
  • WebSocketAuthHandshakeInterceptor validerer token og legger bruker-ID i konteksten.
  • Tilgang kontrolleres på server via STOMP-topic-ruting.

Sekvensdiagram av ws oppkobling mot posisjonsdelingsendepunktet:

sekvensdiagram-ws-oppkobling


Autorisasjon og Roller

Brukere kan ha følgende roller:

  • Vanlig bruker (ROLE_USER)
  • Admin (ROLE_ADMIN)
  • Superadmin (ROLE_SUPER_ADMIN)

Brukere kan oppgraderes til admin via e-postinvitasjon og registreringsnøkkel.


Passord og Kontoendringer

  • Passord må være minst 8 tegn, og inneholde både bokstaver og tall.
  • Endring av passord krever gyldig nåværende passord.
  • Brukere kan ikke endre til et brukernavn som allerede eksisterer.
  • E-postendringer re-initialiserer e-postbekreftelse.

E-post og Tilbakestilling av Passord

Systemet bruker Gmail SMTP for utsending av:

  • Velkomstmail
  • Admin-invitasjon
  • Passord-reset

Reset-lenken inneholder en UUID-basert nøkkel, lagret midlertidig i password_reset_key-tabellen. E-post sendes med EmailService og HTML-maler fra EmailTemplates.


Inputvalidering

Alle eksterne forespørsler valideres eksplisitt via Validate-verktøysklasse:

  • Ikke-null
  • Ikke-tom streng
  • Regex-sjekk for e-post
  • Brukertilgang kontrolleres eksplisitt i sensitive endepunkter

CORS

CorsConfig begrenser forespørsler til tillatte domener via:

  • spring.cors.allowed-origins (http://localhost:3000, http://localhost:4000 i utvikling)
  • Kun spesifikke HTTP-metoder og headers er tillatt.

Miljøvariabler og sensitiv data

Sensitiv data som databasepassord og hemmelige nøkler skal legges i en .env fil. Les mer om hva slags variabler som kreves for kjøring av prosjektet under installasjon

Frontendautentisering

For autentisering i frontend brukes next-auth. Når en bruker logger seg inn sender next-serveren en forespørsel til backend om token, før det genereres en sesjon. I denne sesjonen lagres tokenen fra backend, som videre sendes med i hver forespørsel. Dette betyr at alle api-kall til backenden kan både skje på klient- eller serverside, noe som videre også er viktig for lastetid og sikkerhet.

⚠️ **GitHub.com Fallback** ⚠️