SecurityConfig.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package com.danielbohry.authservice.config;
  2. import com.danielbohry.authservice.service.auth.JwtAuthenticationFilter;
  3. import com.danielbohry.authservice.service.auth.RateLimitingFilter;
  4. import com.danielbohry.authservice.service.user.UserService;
  5. import lombok.RequiredArgsConstructor;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.security.authentication.AuthenticationManager;
  9. import org.springframework.security.authentication.AuthenticationProvider;
  10. import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
  11. import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
  12. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  13. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  14. import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
  15. import org.springframework.security.config.http.SessionCreationPolicy;
  16. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  17. import org.springframework.security.crypto.password.PasswordEncoder;
  18. import org.springframework.security.web.SecurityFilterChain;
  19. import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
  20. import org.springframework.http.HttpMethod;
  21. import static org.springframework.security.config.http.SessionCreationPolicy.STATELESS;
  22. @Configuration
  23. @EnableWebSecurity
  24. @RequiredArgsConstructor
  25. public class SecurityConfig {
  26. private final JwtAuthenticationFilter jwtAuthenticationFilter;
  27. private final RateLimitingFilter rateLimitingFilter;
  28. private final UserService userService;
  29. @Bean
  30. public SecurityFilterChain securityFilterChain(HttpSecurity http) {
  31. http
  32. .csrf(AbstractHttpConfigurer::disable)
  33. .authorizeHttpRequests(requests -> requests
  34. .requestMatchers(
  35. "/actuator/health",
  36. "/actuator/info",
  37. "/actuator/prometheus",
  38. "/api/register",
  39. "/api/authenticate",
  40. "/api/forgot-password"
  41. ).permitAll()
  42. .requestMatchers(
  43. "/",
  44. "/index.html",
  45. "/admin.html",
  46. "/css/**",
  47. "/js/**",
  48. "/img/**"
  49. ).permitAll()
  50. .requestMatchers(HttpMethod.OPTIONS, "/api/users", "/api/authorize", "/api/refresh").permitAll()
  51. .requestMatchers("/api/users", "/api/authorize", "/api/refresh").authenticated()
  52. .anyRequest().authenticated()
  53. )
  54. .sessionManagement(manager -> manager.sessionCreationPolicy(STATELESS))
  55. .authenticationProvider(authenticationProvider())
  56. .addFilterBefore(rateLimitingFilter, UsernamePasswordAuthenticationFilter.class)
  57. .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
  58. return http.build();
  59. }
  60. @Bean
  61. public PasswordEncoder passwordEncoder() {
  62. return new BCryptPasswordEncoder();
  63. }
  64. @Bean
  65. public AuthenticationProvider authenticationProvider() {
  66. DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(userService.userDetailsService());
  67. authProvider.setPasswordEncoder(passwordEncoder());
  68. return authProvider;
  69. }
  70. @Bean
  71. public AuthenticationManager authenticationManager(AuthenticationConfiguration config) {
  72. return config.getAuthenticationManager();
  73. }
  74. }