Spaces:
Sleeping
Sleeping
| package com.rods.backtestingstrategies.security; | |
| import lombok.RequiredArgsConstructor; | |
| 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.dao.DaoAuthenticationProvider; | |
| import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; | |
| 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.Customizer; | |
| import org.springframework.security.config.http.SessionCreationPolicy; | |
| import org.springframework.security.core.userdetails.UserDetailsService; | |
| 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; | |
| public class SecurityConfig { | |
| private final JwtAuthenticationFilter jwtAuthFilter; | |
| private final UserDetailsService userDetailsService; | |
| public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { | |
| http | |
| .csrf(AbstractHttpConfigurer::disable) | |
| .cors(Customizer.withDefaults()) | |
| .authorizeHttpRequests(auth -> auth | |
| .requestMatchers(org.springframework.http.HttpMethod.OPTIONS, "/**").permitAll() // Allow preflight checks | |
| .requestMatchers("/api/auth/**", "/server/**", "/error").permitAll() // Whitelist public endpoints | |
| .anyRequest().authenticated() // Secure everything else | |
| ) | |
| .sessionManagement(sess -> sess | |
| .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) | |
| .authenticationProvider(authenticationProvider()) | |
| .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class); | |
| return http.build(); | |
| } | |
| public AuthenticationProvider authenticationProvider() { | |
| DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); | |
| authProvider.setUserDetailsService(userDetailsService); | |
| authProvider.setPasswordEncoder(passwordEncoder()); | |
| return authProvider; | |
| } | |
| public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { | |
| return config.getAuthenticationManager(); | |
| } | |
| public PasswordEncoder passwordEncoder() { | |
| return new BCryptPasswordEncoder(); | |
| } | |
| public org.springframework.web.cors.CorsConfigurationSource corsConfigurationSource() { | |
| org.springframework.web.cors.CorsConfiguration configuration = new org.springframework.web.cors.CorsConfiguration(); | |
| configuration.setAllowedOrigins(java.util.Arrays.asList("http://localhost:5173", "http://localhost:3000", "https://backtest-livid.vercel.app")); | |
| configuration | |
| .setAllowedMethods(java.util.Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD", "PATCH")); | |
| configuration.setAllowedHeaders(java.util.Collections.singletonList("*")); | |
| configuration.setAllowCredentials(true); | |
| org.springframework.web.cors.UrlBasedCorsConfigurationSource source = new org.springframework.web.cors.UrlBasedCorsConfigurationSource(); | |
| source.registerCorsConfiguration("/**", configuration); | |
| return source; | |
| } | |
| } |