diff --git a/CHANGELOG.md b/CHANGELOG.md index ddd7771..57808dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ Versionierung [semantisch](https://semver.org/lang/de/). ## [Unreleased] – 2026-07-21 · Gesamt-Audit: Light Mode, Barrierefreiheit, AP2-Inhalte, DSGVO +### Registrierung & Kontozugang +- **Sofort nutzbare Accounts:** Die Registrierung hängt nicht mehr an der Zustellung + einer Bestätigungs-E-Mail. Neue Accounts können sich direkt anmelden; bereits + wartende Konten werden mit Migration V23 aktiviert. Nicht mehr benötigte + Bestätigungs-Token werden gelöscht. E-Mail bleibt für den Passwort-Reset erhalten. + ### Light Mode & Design - **Browser-Icon:** Das Neural-Emblem wird unter `/favicon.ico` ausgeliefert und direkt auf der Startseite verlinkt. Die Versionierung der Bild-URL ersetzt auch diff --git a/src/main/java/com/example/mindflux/config/SecurityConfig.java b/src/main/java/com/example/mindflux/config/SecurityConfig.java index 6566699..78ccabb 100644 --- a/src/main/java/com/example/mindflux/config/SecurityConfig.java +++ b/src/main/java/com/example/mindflux/config/SecurityConfig.java @@ -75,7 +75,6 @@ public class SecurityConfig { .withUsername(user.getUsername()) .password(user.getPassword()) .roles(user.getRole()) // Achtung: Nur ein String, z.B. "USER" oder "ADMIN" - .disabled(!user.isEmailVerified()) .build(); }; } diff --git a/src/main/java/com/example/mindflux/controller/RegisterController.java b/src/main/java/com/example/mindflux/controller/RegisterController.java index c9072c7..8720dca 100644 --- a/src/main/java/com/example/mindflux/controller/RegisterController.java +++ b/src/main/java/com/example/mindflux/controller/RegisterController.java @@ -1,11 +1,8 @@ package com.example.mindflux.controller; import com.example.mindflux.service.RegistrationResult; -import com.example.mindflux.service.AccountMailService; import com.example.mindflux.service.UserService; import org.springframework.stereotype.Controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -13,14 +10,10 @@ import org.springframework.web.bind.annotation.RequestParam; @Controller public class RegisterController { - private static final Logger log = LoggerFactory.getLogger(RegisterController.class); - private final UserService userService; - private final AccountMailService accountMailService; - public RegisterController(UserService userService, AccountMailService accountMailService) { + public RegisterController(UserService userService) { this.userService = userService; - this.accountMailService = accountMailService; } @GetMapping("/register") @@ -36,18 +29,9 @@ public class RegisterController { @RequestParam(required = false) String confirmPassword) { RegistrationResult result = userService.register(username, email, password, confirmPassword); return switch (result) { - case SUCCESS -> { - try { - var user = userService.findByUsernameIgnoreCase(username.trim()); - yield accountMailService.sendVerificationFor(user) - ? "redirect:/?registerSuccess" - : "redirect:/?registerMailError"; - } catch (RuntimeException e) { - log.warn("mail_event=REGISTRATION_VERIFICATION_FAILED errorType={}", - e.getClass().getSimpleName()); - yield "redirect:/?registerMailError"; - } - } + // Ein SMTP-Problem darf die Nutzung eines neu angelegten Accounts nicht blockieren. + // Die E-Mail-Adresse wird weiterhin für den Passwort-Reset gespeichert. + case SUCCESS -> "redirect:/?registerSuccess"; case PASSWORD_MISMATCH -> "redirect:/?passwordMismatch"; case PASSWORD_TOO_SHORT -> "redirect:/?passwordPolicy"; case EMAIL_INVALID -> "redirect:/?emailInvalid"; diff --git a/src/main/java/com/example/mindflux/service/UserServiceImpl.java b/src/main/java/com/example/mindflux/service/UserServiceImpl.java index 23555bd..b760994 100644 --- a/src/main/java/com/example/mindflux/service/UserServiceImpl.java +++ b/src/main/java/com/example/mindflux/service/UserServiceImpl.java @@ -88,7 +88,9 @@ public class UserServiceImpl implements UserService { return RegistrationResult.EMAIL_TAKEN; } User user = new User(name, passwordEncoder.encode(password), email.trim(), "USER"); - user.setEmailVerified(false); + // Die Registrierung ist bewusst nicht vom Versand oder Empfang einer E-Mail abhängig. + // Damit bleibt der Login auch bei verzögerter bzw. abgewiesener SMTP-Zustellung möglich. + user.setEmailVerified(true); try { userRepository.save(user); } catch (DataIntegrityViolationException e) { diff --git a/src/main/resources/db/migration/V23__activate_existing_accounts.sql b/src/main/resources/db/migration/V23__activate_existing_accounts.sql new file mode 100644 index 0000000..6162e51 --- /dev/null +++ b/src/main/resources/db/migration/V23__activate_existing_accounts.sql @@ -0,0 +1,9 @@ +-- Die Anmeldung ist nicht mehr an die Zustellung einer E-Mail gebunden. +-- Bereits registrierte, bisher noch wartende Accounts werden dadurch nutzbar. +UPDATE users +SET email_verified = TRUE +WHERE email_verified = FALSE; + +-- Verifikations-Links werden nicht mehr benötigt; gespeicherte Hashes entfernen. +DELETE FROM account_email_tokens +WHERE purpose = 'EMAIL_VERIFICATION'; diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index f340d00..b3ace48 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -42,11 +42,9 @@