You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

79 lines
3.5 KiB

  1. package com.ffii.tsms.config.security;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Qualifier;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.context.annotation.Lazy;
  7. import org.springframework.core.annotation.Order;
  8. import org.springframework.http.HttpStatus;
  9. import org.springframework.ldap.core.support.BaseLdapPathContextSource;
  10. import org.springframework.security.authentication.AuthenticationManager;
  11. import org.springframework.security.config.Customizer;
  12. import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
  13. import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
  14. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  15. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  16. import org.springframework.security.config.http.SessionCreationPolicy;
  17. import org.springframework.security.config.ldap.LdapBindAuthenticationManagerFactory;
  18. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  19. import org.springframework.security.crypto.password.PasswordEncoder;
  20. import org.springframework.security.web.SecurityFilterChain;
  21. import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
  22. import com.ffii.tsms.config.security.jwt.JwtRequestFilter;
  23. @Configuration
  24. @EnableWebSecurity
  25. @EnableMethodSecurity
  26. public class SecurityConfig {
  27. public static final String INDEX_URL = "/";
  28. public static final String LOGIN_URL = "/login";
  29. public static final String LDAP_LOGIN_URL = "/ldap-login";
  30. public static final String INVOICE = "/invoices/pdf";
  31. public static final String SWAGGER_URL = "/v3/api-docs/**";
  32. public static final String SWAGGER_INDEX_URL = "/swagger-ui/**";
  33. public static final String[] URL_WHITELIST = {
  34. INDEX_URL,
  35. LOGIN_URL,
  36. LDAP_LOGIN_URL,
  37. INVOICE,
  38. SWAGGER_URL,
  39. SWAGGER_INDEX_URL
  40. };
  41. @Lazy
  42. @Autowired
  43. private JwtRequestFilter jwtRequestFilter;
  44. @Bean
  45. @Qualifier("AuthenticationManager")
  46. public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration)
  47. throws Exception {
  48. return authenticationConfiguration.getAuthenticationManager();
  49. }
  50. @Bean
  51. public PasswordEncoder passwordEncoder() {
  52. return new BCryptPasswordEncoder();
  53. }
  54. @Bean
  55. @Order(1)
  56. public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  57. return http
  58. .cors(Customizer.withDefaults()).csrf(csrf -> csrf.disable())
  59. .requestCache(requestCache -> requestCache.disable())
  60. .authorizeHttpRequests(
  61. authRequest -> authRequest.requestMatchers(URL_WHITELIST).permitAll().anyRequest().authenticated())
  62. .httpBasic(httpBasic -> httpBasic.authenticationEntryPoint(
  63. (request, response, authException) -> response.sendError(HttpStatus.UNAUTHORIZED.value())))
  64. .sessionManagement(
  65. sessionManagement -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
  66. .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
  67. .build();
  68. }
  69. }