From 3b154135f1cab4a4d5fd75d359627463380f8937 Mon Sep 17 00:00:00 2001 From: Hannah <hz018@hdm-stuttgart.de> Date: Thu, 21 Dec 2023 12:24:43 +0100 Subject: [PATCH] exception handling if email is invalid or already exists --- growbros-frontend/src/components/Footer.tsx | 21 ------- growbros-frontend/src/pages/Login.tsx | 17 +++--- growbros-frontend/src/pages/Register.tsx | 56 ++++++++++++------- .../growbros/auth/AuthenticationService.java | 25 +++++++++ .../exceptions/InvalidDataException.java | 8 +++ .../exceptions/InvalidEmailException.java | 7 +++ .../growbros/security/ApplicationConfig.java | 2 +- 7 files changed, 86 insertions(+), 50 deletions(-) delete mode 100644 growbros-frontend/src/components/Footer.tsx create mode 100644 src/main/java/hdm/mi/growbros/exceptions/InvalidDataException.java create mode 100644 src/main/java/hdm/mi/growbros/exceptions/InvalidEmailException.java diff --git a/growbros-frontend/src/components/Footer.tsx b/growbros-frontend/src/components/Footer.tsx deleted file mode 100644 index cc81f27..0000000 --- a/growbros-frontend/src/components/Footer.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import {NavLink} from "react-router-dom"; -import {deleteCookie} from "../jwt/Cookies.ts"; - -function Footer() { - const handleLogout = () => { - deleteCookie('Jwt'); - }; - return ( - <nav> - <ul> - <div className="navLinks"> - <li> - <NavLink to="/home" onClick={handleLogout}> - Ausloggen</NavLink> - </li> - </div> - </ul> - </nav> - ); -} -export default Footer(); \ No newline at end of file diff --git a/growbros-frontend/src/pages/Login.tsx b/growbros-frontend/src/pages/Login.tsx index 21c4eed..7a158f6 100644 --- a/growbros-frontend/src/pages/Login.tsx +++ b/growbros-frontend/src/pages/Login.tsx @@ -16,7 +16,6 @@ function Login() { await handleLogin(); }; const handleLogin = async () => { - try { const res = await fetch("http://localhost:8080/api/v1/auth/authenticate",{ method:"POST", body:JSON.stringify({email:email,password:password}), @@ -38,14 +37,18 @@ function Login() { navigate('/'); } else { - window.alert(`Fehler bei der Anmeldung: ${res.status} - ${res.statusText}`); + const errorBody = await res.json(); + if (res.status === 400 && errorBody.error === 'InvalidEmailException') { + window.alert("Fehler bei der Anmeldung: Ungültige E-Mail-Adresse."); + console.error('Fehler bei der Anmeldung: Ungültige E-Mail-Adresse.'); + } else { + window.alert(`Fehler bei der Anmeldung: ${res.status} - ${res.statusText}`); + console.error('Fehler bei der Anmeldung:', res.status, res.statusText); + } + navigate('/login'); - console.error('Fehler bei der Anmeldung:', res.status, res.statusText); - } - } catch (error:any) { - console.error('Fehler bei der Anmeldung:', error.message); - } + } }; return ( diff --git a/growbros-frontend/src/pages/Register.tsx b/growbros-frontend/src/pages/Register.tsx index 7f56bc0..cfb5404 100644 --- a/growbros-frontend/src/pages/Register.tsx +++ b/growbros-frontend/src/pages/Register.tsx @@ -44,17 +44,17 @@ function Register() { e.preventDefault(); //verhindert, dass die Seite neu geladen wird, wenn das Formular abgeschickt wird if (!isValidEmail(email)) { - openErrorModal('Ungültige E-Mail-Adresse'); + openErrorModal('Ungültige E-Mail-Adresse. Frontend'); return; } if (!isValidName(firstname) || !isValidName(lastname)) { - openErrorModal('Vorname und Nachname dürfen nicht leer sein'); + openErrorModal('Vorname und Nachname dürfen nicht leer sein. Frontend'); return; } if (!isValidPassword(password)) { - openErrorModal('Das Passwort muss mindestens 4 Zeichen lang sein'); + openErrorModal('Das Passwort muss mindestens 4 Zeichen lang sein. Frontend'); return; } await handleRegister(); @@ -64,31 +64,45 @@ function Register() { console.log("handle register") try { const requestBody = { - firstname:firstname, - lastname:lastname, - email:email, - password:password + firstname: firstname, + lastname: lastname, + email: email, + password: password }; console.log(requestBody) const res = await fetch("http://localhost:8080/api/v1/auth/register", { - method:"POST", + method: "POST", headers: { "Content-Type": "application/json" }, - body:JSON.stringify(requestBody - )} + body: JSON.stringify(requestBody) + } ) - const {token} = await res.json(); - console.log("Jwt Token not decoded"+token); - const decodedToken = jwtDecode(token); - // @ts-ignore - const expirationDate = new Date(decodedToken.exp * 1000); //*1000 Anzahl der Sekunden seit 1.1.1970 darstellt - JS arbeitet jedoch normalerweise mit Millisekunden - setCookie("Jwt",token, expirationDate); - console.log("Jwt decoded " + decodedToken); - navigate('/'); - } catch (error:any) { - console.error('Fehler bei der Anmeldung:', error.message); - console.dir(error) + if (res.ok) { + const {token} = await res.json(); + console.log("Jwt Token not decoded" + token); + const decodedToken = jwtDecode(token); + // @ts-ignore + const expirationDate = new Date(decodedToken.exp * 1000); //*1000 Anzahl der Sekunden seit 1.1.1970 darstellt - JS arbeitet jedoch normalerweise mit Millisekunden + setCookie("Jwt", token, expirationDate); + console.log("Jwt decoded " + decodedToken); + navigate('/'); + } else { + const errorBody = await res.json(); + if (res.status === 400 && errorBody.error === 'InvalidEmailException') { + window.alert("Fehler bei der Anmeldung: Ungültige E-Mail-Adresse."); + console.error('Fehler bei der Anmeldung: Ungültige E-Mail-Adresse.'); + } else if (res.status === 409 && errorBody.error === 'DataIntegrityViolationException') { + window.alert("Fehler bei der Anmeldung: E-Mail-Adresse bereits vorhanden."); + console.error('Fehler bei der Anmeldung: E-Mail-Adresse bereits vorhanden.'); + + } else { + window.alert(`Fehler bei der Anmeldung: ${res.status} - ${res.statusText}`); + console.error('Fehler bei der Anmeldung:', res.status, res.statusText); + } + } + + } catch (e) { } }; diff --git a/src/main/java/hdm/mi/growbros/auth/AuthenticationService.java b/src/main/java/hdm/mi/growbros/auth/AuthenticationService.java index 9cba373..5eefc1f 100644 --- a/src/main/java/hdm/mi/growbros/auth/AuthenticationService.java +++ b/src/main/java/hdm/mi/growbros/auth/AuthenticationService.java @@ -1,5 +1,7 @@ package hdm.mi.growbros.auth; +import hdm.mi.growbros.exceptions.InvalidDataException; +import hdm.mi.growbros.exceptions.InvalidEmailException; import hdm.mi.growbros.models.user.Role; import hdm.mi.growbros.models.user.User; import hdm.mi.growbros.models.user.UserRepository; @@ -9,6 +11,8 @@ import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import java.util.regex.Matcher; +import java.util.regex.Pattern; @Service @RequiredArgsConstructor @@ -24,6 +28,19 @@ public class AuthenticationService { * @return */ public AuthenticationResponse register(RegisterRequest request) { + + if (!isValidEmail(request.getEmail())) { + throw new InvalidEmailException("Ungültige E-Mail-Adresse. Backend"); + } + + if (request.getFirstname().length() < 4 ) { + throw new InvalidDataException("Vorname muss mindestens 4 Zeichen lang sein. Backend"); + } + + if (request.getLastname().length() < 4) { + throw new InvalidDataException("Nachname muss mindestens 4 Zeichen lang sein. Backend"); + } + var user = User.builder() .firstname(request.getFirstname()) .lastname(request.getLastname()) @@ -53,4 +70,12 @@ public class AuthenticationService { .token(jwtToken) .build(); } + + private boolean isValidEmail(String email) { + String emailRegex = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}$"; + Pattern pattern = Pattern.compile(emailRegex); + Matcher matcher = pattern.matcher(email); + return matcher.matches(); + } + } diff --git a/src/main/java/hdm/mi/growbros/exceptions/InvalidDataException.java b/src/main/java/hdm/mi/growbros/exceptions/InvalidDataException.java new file mode 100644 index 0000000..294be06 --- /dev/null +++ b/src/main/java/hdm/mi/growbros/exceptions/InvalidDataException.java @@ -0,0 +1,8 @@ +package hdm.mi.growbros.exceptions; + +public class InvalidDataException extends RuntimeException{ + public InvalidDataException(String message) { + super(message); + } +} + diff --git a/src/main/java/hdm/mi/growbros/exceptions/InvalidEmailException.java b/src/main/java/hdm/mi/growbros/exceptions/InvalidEmailException.java new file mode 100644 index 0000000..34a7752 --- /dev/null +++ b/src/main/java/hdm/mi/growbros/exceptions/InvalidEmailException.java @@ -0,0 +1,7 @@ +package hdm.mi.growbros.exceptions; + +public class InvalidEmailException extends RuntimeException{ + public InvalidEmailException(String message) { + super(message); + } +} diff --git a/src/main/java/hdm/mi/growbros/security/ApplicationConfig.java b/src/main/java/hdm/mi/growbros/security/ApplicationConfig.java index cdcfea2..22a72c6 100644 --- a/src/main/java/hdm/mi/growbros/security/ApplicationConfig.java +++ b/src/main/java/hdm/mi/growbros/security/ApplicationConfig.java @@ -17,7 +17,7 @@ import org.springframework.security.crypto.password.PasswordEncoder; @RequiredArgsConstructor public class ApplicationConfig { private final UserRepository repository; - @Bean //Schnittstelle die verwendet wird, um Benutzerdetails zu laden + @Bean public UserDetailsService userDetailsService() { return username -> repository.findByEmail(username) .orElseThrow(() -> new UsernameNotFoundException("User not found")); -- GitLab