SecurityConfig.java 4.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package com.njuzr.eaibackend.config;
  2. import com.njuzr.eaibackend.exception.MyAccessDeniedHandler;
  3. import com.njuzr.eaibackend.exception.MyAuthenticationEntryPoint;
  4. import com.njuzr.eaibackend.service.MyUserDetailService;
  5. import com.njuzr.eaibackend.utils.JWTTokenUtil;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.security.authentication.AuthenticationManager;
  10. import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
  11. import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
  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. /**
  21. * @author: Leonezhurui
  22. * @Date: 2024/2/19 - 16:28
  23. * @Package: EAI-Backend
  24. */
  25. @Configuration
  26. @EnableWebSecurity
  27. @EnableMethodSecurity(prePostEnabled = true)
  28. public class SecurityConfig {
  29. private final MyAuthenticationEntryPoint unauthorizedHandler;
  30. private final MyAccessDeniedHandler accessDeniedHandler;
  31. private final MyUserDetailService userDetailsService;
  32. private final JWTTokenUtil jwtTokenUtil;
  33. @Autowired
  34. public SecurityConfig(MyAuthenticationEntryPoint unauthorizedHandler, MyAccessDeniedHandler accessDeniedHandler, MyUserDetailService userDetailsService, JWTTokenUtil jwtTokenUtil) {
  35. this.unauthorizedHandler = unauthorizedHandler;
  36. this.accessDeniedHandler = accessDeniedHandler;
  37. this.userDetailsService = userDetailsService;
  38. this.jwtTokenUtil = jwtTokenUtil;
  39. }
  40. @Bean
  41. public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  42. http
  43. .authorizeHttpRequests(authorize -> authorize
  44. // .anyRequest().permitAll() // 允许所有的请求访问
  45. .requestMatchers("/api/user/login").permitAll() // 允许公开访问的路径
  46. .requestMatchers("/api/user/register").permitAll()
  47. .anyRequest().authenticated() // 其他所有请求需要认证
  48. )
  49. .exceptionHandling(exception -> exception
  50. .authenticationEntryPoint(unauthorizedHandler)) // 认证失败处理(未提供认证信息)
  51. .exceptionHandling(exception -> exception.accessDeniedHandler(accessDeniedHandler)) // 权限不够
  52. .csrf(AbstractHttpConfigurer::disable) // 禁用CSRF
  53. .formLogin(AbstractHttpConfigurer::disable) // 禁用登陆表单
  54. .httpBasic(AbstractHttpConfigurer::disable) // 禁用http basic
  55. .sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); // 设置为无状态
  56. // 获取AuthenticationManager
  57. AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class);
  58. // 配置UsernamePasswordAuthenticationFilter
  59. UsernamePasswordAuthenticationFilter authenticationFilter = new UsernamePasswordAuthenticationFilter();
  60. authenticationFilter.setAuthenticationManager(authenticationManager);
  61. // 配置自定义认证成功和失败处理器
  62. authenticationFilter.setAuthenticationSuccessHandler(new MyAuthenticationSuccessHandler());
  63. authenticationFilter.setAuthenticationFailureHandler(new MyAuthenticationFailureHandler());
  64. // JWT过滤器(在过滤器中已经实现了Token解析,不通过Provider解析)
  65. JWTAuthenticationFilter jwtAuthenticationFilter = new JWTAuthenticationFilter(jwtTokenUtil, userDetailsService);
  66. // 将自定义的Filter添加到Spring Security过滤器链中
  67. http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
  68. http.addFilter(authenticationFilter);
  69. return http.build();
  70. }
  71. @Bean
  72. public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
  73. return authenticationConfiguration.getAuthenticationManager();
  74. }
  75. @Bean
  76. public PasswordEncoder passwordEncoder() {
  77. return new BCryptPasswordEncoder();
  78. }
  79. }