SecurityConfig.java 4.9 KB

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