meals-made-easy-api/src/main/java/app/mealsmadeeasy/api/security/SecurityConfiguration.java
2026-01-24 14:39:07 -06:00

85 lines
3.6 KiB
Java

package app.mealsmadeeasy.api.security;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
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.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import java.util.List;
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfiguration {
private final JpaUserDetailsService jpaUserDetailsService;
private final BeanFactory beanFactory;
private final List<EndpointAuthConfigurator> endpointAuthConfigurators;
public SecurityConfiguration(
JpaUserDetailsService jpaUserDetailsService,
BeanFactory beanFactory,
List<EndpointAuthConfigurator> endpointAuthConfigurators
) {
this.jpaUserDetailsService = jpaUserDetailsService;
this.beanFactory = beanFactory;
this.endpointAuthConfigurators = endpointAuthConfigurators;
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
httpSecurity.authorizeHttpRequests(requests -> {
this.endpointAuthConfigurators.forEach(endpointAuthConfigurator -> {
endpointAuthConfigurator.configure(requests);
});
});
httpSecurity.csrf(AbstractHttpConfigurer::disable);
httpSecurity.cors(Customizer.withDefaults());
httpSecurity.sessionManagement(sessionManagement -> sessionManagement.sessionCreationPolicy(
SessionCreationPolicy.STATELESS
));
httpSecurity.exceptionHandling(exceptionHandling -> {
exceptionHandling.authenticationEntryPoint((request, response, authException) -> {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authException.getMessage());
});
});
httpSecurity.addFilterBefore(
this.beanFactory.getBean(JwtFilter.class),
UsernamePasswordAuthenticationFilter.class
);
return httpSecurity.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(10);
}
@Bean
public DaoAuthenticationProvider daoAuthenticationProvider() {
final var provider = new DaoAuthenticationProvider(this.jpaUserDetailsService);
provider.setPasswordEncoder(this.beanFactory.getBean(PasswordEncoder.class));
return provider;
}
@Bean
public AuthenticationManager authenticationManager() {
return new ProviderManager(this.beanFactory.getBean(AuthenticationProvider.class));
}
}