From 9a55149802ee1f3ec3779823456893a384010ecc Mon Sep 17 00:00:00 2001 From: vincentRamiere Date: Thu, 21 Aug 2025 19:46:58 +0200 Subject: [PATCH] Feat: config spring-security pour getRestaurants sans authentification --- .../config/SecurityConfig.java | 42 +++++++++++++++++++ .../repository/PersonneRepository.java | 12 ++++++ .../service/JpaUserDetailsService.java | 29 +++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/config/SecurityConfig.java create mode 100644 src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/repository/PersonneRepository.java create mode 100644 src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/service/JpaUserDetailsService.java diff --git a/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/config/SecurityConfig.java b/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/config/SecurityConfig.java new file mode 100644 index 0000000..b15fb10 --- /dev/null +++ b/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/config/SecurityConfig.java @@ -0,0 +1,42 @@ +package fr.vincent.ramiere.mangerautourdesimplonback.config; + +import fr.vincent.ramiere.mangerautourdesimplonback.service.JpaUserDetailsService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +@EnableMethodSecurity +public class SecurityConfig { + + private final JpaUserDetailsService jpaUserDetailsService; + + public SecurityConfig(JpaUserDetailsService jpaUserDetailsService) { + this.jpaUserDetailsService = jpaUserDetailsService; + } + + @Bean + SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + return http + .csrf(csrf -> csrf.disable()) + .authorizeHttpRequests(auth -> auth + .requestMatchers("/api/v1/restaurants/**").permitAll() + .requestMatchers("/api/v1/personnes/**").permitAll() + .anyRequest().authenticated()) + .userDetailsService(jpaUserDetailsService) + .httpBasic(Customizer.withDefaults()) + .build(); + } + + @Bean + PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/repository/PersonneRepository.java b/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/repository/PersonneRepository.java new file mode 100644 index 0000000..b874bf9 --- /dev/null +++ b/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/repository/PersonneRepository.java @@ -0,0 +1,12 @@ +package fr.vincent.ramiere.mangerautourdesimplonback.repository; + +import fr.vincent.ramiere.mangerautourdesimplonback.models.Personne; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface PersonneRepository extends JpaRepository { + Optional findByEmail(String email); +} diff --git a/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/service/JpaUserDetailsService.java b/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/service/JpaUserDetailsService.java new file mode 100644 index 0000000..ec70c2a --- /dev/null +++ b/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/service/JpaUserDetailsService.java @@ -0,0 +1,29 @@ +package fr.vincent.ramiere.mangerautourdesimplonback.service; + +import fr.vincent.ramiere.mangerautourdesimplonback.models.Personne; +import fr.vincent.ramiere.mangerautourdesimplonback.repository.PersonneRepository; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +public class JpaUserDetailsService implements UserDetailsService { + + private final PersonneRepository personneRepository; + + public JpaUserDetailsService(PersonneRepository personneRepository) { + this.personneRepository = personneRepository; + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + Personne personne = personneRepository.findByEmail(username) + .orElseThrow(() -> new UsernameNotFoundException("Aucun utilisateur trouvé avec l'email: " + username)); + + return new org.springframework.security.core.userdetails.User( + personne.getEmail(), + personne.getPassword(), + personne.getRoleList()); + } +}