package com.ffii.tsms.config.security; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.ldap.core.support.BaseLdapPathContextSource; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; 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.http.SessionCreationPolicy; import org.springframework.security.config.ldap.LdapBindAuthenticationManagerFactory; 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 com.ffii.tsms.config.security.jwt.JwtRequestFilter; @Configuration @EnableWebSecurity @EnableMethodSecurity public class SecurityConfig { public static final String INDEX_URL = "/"; public static final String LOGIN_URL = "/login"; public static final String LDAP_LOGIN_URL = "/ldap-login"; public static final String INVOICE = "/invoices/pdf"; public static final String SWAGGER_URL = "/v3/api-docs/**"; public static final String SWAGGER_INDEX_URL = "/swagger-ui/**"; public static final String[] URL_WHITELIST = { INDEX_URL, LOGIN_URL, LDAP_LOGIN_URL, INVOICE, SWAGGER_URL, SWAGGER_INDEX_URL }; @Lazy @Autowired private JwtRequestFilter jwtRequestFilter; @Bean @Qualifier("AuthenticationManager") public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { return authenticationConfiguration.getAuthenticationManager(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean @Order(1) public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http .cors(Customizer.withDefaults()).csrf(csrf -> csrf.disable()) .requestCache(requestCache -> requestCache.disable()) .authorizeHttpRequests( authRequest -> authRequest.requestMatchers(URL_WHITELIST).permitAll().anyRequest().authenticated()) .httpBasic(httpBasic -> httpBasic.authenticationEntryPoint( (request, response, authException) -> response.sendError(HttpStatus.UNAUTHORIZED.value()))) .sessionManagement( sessionManagement -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class) .build(); } }