blob: 7ab3aa18bf0450edcbdd98191ff611469d29a976 [file] [log] [blame]
wuchimedes079c1632025-04-02 22:01:20 +08001package com.example.g8backend.config;
2
夜雨声烦451d71c2025-05-20 00:58:36 +08003import com.example.g8backend.filter.JwtAuthenticationFilter;
wuchimedes079c1632025-04-02 22:01:20 +08004import org.springframework.context.annotation.Bean;
5import org.springframework.context.annotation.Configuration;
wuchimedes223bfab2025-04-04 17:16:05 +08006import org.springframework.security.authentication.AuthenticationManager;
7import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
8import org.springframework.security.config.annotation.web.builders.HttpSecurity;
夜雨声烦451d71c2025-05-20 00:58:36 +08009import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
wuchimedes223bfab2025-04-04 17:16:05 +080010import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
wuchimedes079c1632025-04-02 22:01:20 +080011import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
wuchimedes223bfab2025-04-04 17:16:05 +080012import org.springframework.security.web.SecurityFilterChain;
13import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
wuchimedesb4fbcdf2025-06-06 20:08:27 +080014import org.springframework.web.cors.CorsConfiguration;
15import org.springframework.web.cors.CorsConfigurationSource;
16import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
17
18import java.util.List;
wuchimedes079c1632025-04-02 22:01:20 +080019
wuchimedes079c1632025-04-02 22:01:20 +080020@Configuration
wuchimedes223bfab2025-04-04 17:16:05 +080021@EnableWebSecurity
wuchimedes079c1632025-04-02 22:01:20 +080022public class SecurityConfig {
wuchimedes223bfab2025-04-04 17:16:05 +080023 private final JwtAuthenticationFilter jwtAuthenticationFilter;
24
25 public SecurityConfig(JwtAuthenticationFilter jwtAuthenticationFilter) {
26 this.jwtAuthenticationFilter = jwtAuthenticationFilter;
27 }
28
29 @Bean
夜雨声烦451d71c2025-05-20 00:58:36 +080030 public BCryptPasswordEncoder passwordEncoder() {
31 return new BCryptPasswordEncoder();
32 }
33
34 @Bean
wuchimedes223bfab2025-04-04 17:16:05 +080035 public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
36 return http
夜雨声烦451d71c2025-05-20 00:58:36 +080037 .csrf(AbstractHttpConfigurer::disable)
wuchimedesb4fbcdf2025-06-06 20:08:27 +080038 .cors()
39 .and()
夜雨声烦451d71c2025-05-20 00:58:36 +080040 .authorizeHttpRequests(auth -> auth
夜雨声烦451d71c2025-05-20 00:58:36 +080041 .requestMatchers("/admin/**").hasRole("ADMIN")
夜雨声烦451d71c2025-05-20 00:58:36 +080042 .requestMatchers("/user/signin").authenticated()
夜雨声烦451d71c2025-05-20 00:58:36 +080043 .anyRequest().permitAll()
44 )
45 .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
46 .build();
wuchimedes223bfab2025-04-04 17:16:05 +080047 }
48
49 @Bean
wuchimedesb4fbcdf2025-06-06 20:08:27 +080050 public CorsConfigurationSource corsConfigurationSource() {
51 CorsConfiguration config = new CorsConfiguration();
52 config.setAllowCredentials(true);
53 config.setAllowedOriginPatterns(List.of("http://localhost:8081")); // ✅ 尽量具体写域名
54 config.setAllowedHeaders(List.of("*"));
55 config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
56
57 UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
58 source.registerCorsConfiguration("/**", config);
59 return source;
60 }
61
62 @Bean
wuchimedes223bfab2025-04-04 17:16:05 +080063 public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
64 return config.getAuthenticationManager();
65 }
夜雨声烦451d71c2025-05-20 00:58:36 +080066}