diff --git a/src/main/java/com/example/mindflux/config/SecurityConfig.java b/src/main/java/com/example/mindflux/config/SecurityConfig.java index 9a1b075..258bcac 100644 --- a/src/main/java/com/example/mindflux/config/SecurityConfig.java +++ b/src/main/java/com/example/mindflux/config/SecurityConfig.java @@ -49,7 +49,7 @@ public class SecurityConfig { @Bean public UserDetailsService userDetailsService(UserRepository userRepo) { return username -> { - User user = userRepo.findByUsername(username) + User user = userRepo.findByUsernameIgnoreCase(username) .orElseThrow(() -> new UsernameNotFoundException("Benutzer nicht gefunden")); return org.springframework.security.core.userdetails.User diff --git a/src/main/java/com/example/mindflux/controller/RegisterController.java b/src/main/java/com/example/mindflux/controller/RegisterController.java index 3a6ccec..21fc16a 100644 --- a/src/main/java/com/example/mindflux/controller/RegisterController.java +++ b/src/main/java/com/example/mindflux/controller/RegisterController.java @@ -24,17 +24,24 @@ public class RegisterController { } @PostMapping("/register") - public String processRegistration(@ModelAttribute("user") User user, Model model) { - // Benutzername klein schreiben, um Doppelungen zu vermeiden - user.setUsername(user.getUsername().toLowerCase()); + public String processRegistration(@ModelAttribute("user") User user, + @RequestParam(value = "confirmPassword", required = false) String confirmPassword) { + // Schreibweise des Benutzernamens beibehalten, nur trimmen + String username = user.getUsername() == null ? "" : user.getUsername().trim(); + user.setUsername(username); - // Prüfen, ob Benutzername schon existiert - if (userService.findByUsername(user.getUsername()) != null) { - // Zurück zur kombinierten Login/Signup-Seite mit geöffnetem Signup-Panel + // Passwörter müssen übereinstimmen (Schutz vor Tippfehlern bei der Eingabe) + if (user.getPassword() == null || user.getPassword().isBlank() + || !user.getPassword().equals(confirmPassword)) { + return "redirect:/?passwordMismatch"; + } + + // Benutzername schon vergeben? (case-insensitiv, damit "Alice" und "alice" nicht kollidieren) + if (username.isBlank() || userService.findByUsernameIgnoreCase(username) != null) { return "redirect:/?registerError"; } - // Passwort verschlüsseln + // Passwort verschlüsseln und speichern user.setPassword(passwordEncoder.encode(user.getPassword())); user.setRole("USER"); // Standardrolle userService.save(user); diff --git a/src/main/java/com/example/mindflux/repository/UserRepository.java b/src/main/java/com/example/mindflux/repository/UserRepository.java index 657e138..ad251e7 100644 --- a/src/main/java/com/example/mindflux/repository/UserRepository.java +++ b/src/main/java/com/example/mindflux/repository/UserRepository.java @@ -9,6 +9,9 @@ public interface UserRepository extends JpaRepository { // Benutzer anhand des Benutzernamens suchen Optional findByUsername(String username); + // Case-insensitive Suche: Login und Registrierung sollen unabhängig von Groß-/Kleinschreibung greifen + Optional findByUsernameIgnoreCase(String username); + // Benutzer anhand des Benutzernamens löschen void deleteByUsername(String username); } \ No newline at end of file diff --git a/src/main/java/com/example/mindflux/service/UserService.java b/src/main/java/com/example/mindflux/service/UserService.java index 651306d..38168bd 100644 --- a/src/main/java/com/example/mindflux/service/UserService.java +++ b/src/main/java/com/example/mindflux/service/UserService.java @@ -4,6 +4,7 @@ import com.example.mindflux.model.User; public interface UserService { User findByUsername(String username); + User findByUsernameIgnoreCase(String username); void save(User user); void deleteByUsername(String username); // <-- Nur die Methodensignatur, ohne {} } diff --git a/src/main/java/com/example/mindflux/service/UserServiceImpl.java b/src/main/java/com/example/mindflux/service/UserServiceImpl.java index 1e0a617..e011abf 100644 --- a/src/main/java/com/example/mindflux/service/UserServiceImpl.java +++ b/src/main/java/com/example/mindflux/service/UserServiceImpl.java @@ -25,6 +25,11 @@ public class UserServiceImpl implements UserService { return userRepository.findByUsername(username).orElse(null); // <-- Optional aufgelöst } + @Override + public User findByUsernameIgnoreCase(String username) { + return userRepository.findByUsernameIgnoreCase(username).orElse(null); + } + @Override public void save(User user) { userRepository.save(user); diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 372ca56..6529c1a 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -58,6 +58,7 @@
Benutzername bereits vergeben.
+
Die Passwörter stimmen nicht überein. Bitte erneut eingeben.
@@ -72,6 +73,11 @@
+
+ + +
+
@@ -128,10 +134,30 @@ el.addEventListener('click', function (e) { e.preventDefault(); c.classList.remove('active'); }); }); - // Bei Registrierungsfehler direkt das Signup-Panel öffnen - if (new URLSearchParams(window.location.search).has('registerError')) { + // Bei Registrierungs-/Passwortfehler direkt das Signup-Panel öffnen + var qp = new URLSearchParams(window.location.search); + if (qp.has('registerError') || qp.has('passwordMismatch')) { c.classList.add('active'); } + + // Client-seitiger Passwort-Abgleich (sofortiges Feedback; der Server prüft zusätzlich) + var pw = document.getElementById('reg-password'); + var pw2 = document.getElementById('reg-password2'); + var pwMsg = document.getElementById('reg-pw-msg'); + var signupForm = pw2 ? pw2.closest('form') : null; + function pwCheck() { + var mismatch = pw2.value.length > 0 && pw.value !== pw2.value; + if (pwMsg) pwMsg.style.display = mismatch ? 'block' : 'none'; + pw2.setCustomValidity(pw.value !== pw2.value ? 'Passwörter stimmen nicht überein' : ''); + return !mismatch; + } + if (pw && pw2) { + pw.addEventListener('input', pwCheck); + pw2.addEventListener('input', pwCheck); + if (signupForm) signupForm.addEventListener('submit', function (e) { + if (pw.value !== pw2.value) { e.preventDefault(); pwCheck(); c.classList.add('active'); } + }); + } })();