|
|
@@ -0,0 +1,85 @@
|
|
|
+package com.njuzr.eaibackend.config;
|
|
|
+
|
|
|
+import com.njuzr.eaibackend.exception.MyAuthenticationEntryPoint;
|
|
|
+import com.njuzr.eaibackend.service.MyUserDetailService;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.context.annotation.Bean;
|
|
|
+import org.springframework.context.annotation.Configuration;
|
|
|
+import org.springframework.security.authentication.AuthenticationManager;
|
|
|
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
|
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
|
|
+import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
|
|
|
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
|
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
|
|
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
|
|
|
+import org.springframework.security.core.Authentication;
|
|
|
+import org.springframework.security.core.userdetails.UserDetailsService;
|
|
|
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
|
+import org.springframework.security.crypto.password.NoOpPasswordEncoder;
|
|
|
+import org.springframework.security.crypto.password.PasswordEncoder;
|
|
|
+import org.springframework.security.web.SecurityFilterChain;
|
|
|
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author: Leonezhurui
|
|
|
+ * @Date: 2024/2/19 - 16:28
|
|
|
+ * @Package: EAI-Backend
|
|
|
+ */
|
|
|
+
|
|
|
+@Configuration
|
|
|
+@EnableWebSecurity
|
|
|
+public class SecurityConfig {
|
|
|
+
|
|
|
+ private final MyAuthenticationEntryPoint unauthorizedHandler;
|
|
|
+
|
|
|
+ private final MyUserDetailService userDetailsService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ public SecurityConfig(MyAuthenticationEntryPoint unauthorizedHandler, MyUserDetailService userDetailsService) {
|
|
|
+ this.unauthorizedHandler = unauthorizedHandler;
|
|
|
+ this.userDetailsService = userDetailsService;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
|
|
+ http
|
|
|
+ .authorizeHttpRequests(authorize -> authorize
|
|
|
+// .anyRequest().permitAll() // 允许所有的请求访问
|
|
|
+ .requestMatchers("/api/public/**").permitAll() // 允许公开访问的路径
|
|
|
+ .anyRequest().authenticated() // 其他所有请求需要认证
|
|
|
+ )
|
|
|
+ .exceptionHandling(exception -> exception
|
|
|
+ .authenticationEntryPoint(unauthorizedHandler)) // 认证失败处理(未提供认证信息)
|
|
|
+ .csrf(AbstractHttpConfigurer::disable) // 禁用CSRF
|
|
|
+ .formLogin(AbstractHttpConfigurer::disable) // 禁用登陆表单
|
|
|
+ .httpBasic(AbstractHttpConfigurer::disable) // 禁用http basic
|
|
|
+ ;
|
|
|
+
|
|
|
+ // 获取AuthenticationManager
|
|
|
+ AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class);
|
|
|
+
|
|
|
+ // 配置UsernamePasswordAuthenticationFilter
|
|
|
+ UsernamePasswordAuthenticationFilter authenticationFilter = new UsernamePasswordAuthenticationFilter();
|
|
|
+ authenticationFilter.setAuthenticationManager(authenticationManager);
|
|
|
+
|
|
|
+ // 配置自定义认证成功和失败处理器
|
|
|
+ authenticationFilter.setAuthenticationSuccessHandler(new MyAuthenticationSuccessHandler());
|
|
|
+ authenticationFilter.setAuthenticationFailureHandler(new MyAuthenticationFailureHandler());
|
|
|
+
|
|
|
+ // 将自定义的Filter添加到Spring Security过滤器链中
|
|
|
+ http.addFilter(authenticationFilter);
|
|
|
+
|
|
|
+ return http.build();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
|
|
|
+ return authenticationConfiguration.getAuthenticationManager();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ public PasswordEncoder passwordEncoder() {
|
|
|
+ return new BCryptPasswordEncoder();
|
|
|
+ }
|
|
|
+
|
|
|
+}
|