|
|
@@ -1,21 +1,20 @@
|
|
|
package com.njuzr.eaibackend.config;
|
|
|
|
|
|
+import com.njuzr.eaibackend.exception.MyAccessDeniedHandler;
|
|
|
import com.njuzr.eaibackend.exception.MyAuthenticationEntryPoint;
|
|
|
import com.njuzr.eaibackend.service.MyUserDetailService;
|
|
|
+import com.njuzr.eaibackend.utils.JWTTokenUtil;
|
|
|
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.method.configuration.EnableMethodSecurity;
|
|
|
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.config.http.SessionCreationPolicy;
|
|
|
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;
|
|
|
@@ -28,16 +27,23 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic
|
|
|
|
|
|
@Configuration
|
|
|
@EnableWebSecurity
|
|
|
+@EnableMethodSecurity(prePostEnabled = true)
|
|
|
public class SecurityConfig {
|
|
|
|
|
|
private final MyAuthenticationEntryPoint unauthorizedHandler;
|
|
|
|
|
|
+ private final MyAccessDeniedHandler accessDeniedHandler;
|
|
|
+
|
|
|
private final MyUserDetailService userDetailsService;
|
|
|
|
|
|
+ private final JWTTokenUtil jwtTokenUtil;
|
|
|
+
|
|
|
@Autowired
|
|
|
- public SecurityConfig(MyAuthenticationEntryPoint unauthorizedHandler, MyUserDetailService userDetailsService) {
|
|
|
+ public SecurityConfig(MyAuthenticationEntryPoint unauthorizedHandler, MyAccessDeniedHandler accessDeniedHandler, MyUserDetailService userDetailsService, JWTTokenUtil jwtTokenUtil) {
|
|
|
this.unauthorizedHandler = unauthorizedHandler;
|
|
|
+ this.accessDeniedHandler = accessDeniedHandler;
|
|
|
this.userDetailsService = userDetailsService;
|
|
|
+ this.jwtTokenUtil = jwtTokenUtil;
|
|
|
}
|
|
|
|
|
|
@Bean
|
|
|
@@ -51,10 +57,11 @@ public class SecurityConfig {
|
|
|
)
|
|
|
.exceptionHandling(exception -> exception
|
|
|
.authenticationEntryPoint(unauthorizedHandler)) // 认证失败处理(未提供认证信息)
|
|
|
+ .exceptionHandling(exception -> exception.accessDeniedHandler(accessDeniedHandler)) // 权限不够
|
|
|
.csrf(AbstractHttpConfigurer::disable) // 禁用CSRF
|
|
|
.formLogin(AbstractHttpConfigurer::disable) // 禁用登陆表单
|
|
|
.httpBasic(AbstractHttpConfigurer::disable) // 禁用http basic
|
|
|
- ;
|
|
|
+ .sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); // 设置为无状态
|
|
|
|
|
|
// 获取AuthenticationManager
|
|
|
AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class);
|
|
|
@@ -67,7 +74,11 @@ public class SecurityConfig {
|
|
|
authenticationFilter.setAuthenticationSuccessHandler(new MyAuthenticationSuccessHandler());
|
|
|
authenticationFilter.setAuthenticationFailureHandler(new MyAuthenticationFailureHandler());
|
|
|
|
|
|
+ // JWT过滤器(在过滤器中已经实现了Token解析,不通过Provider解析)
|
|
|
+ JWTAuthenticationFilter jwtAuthenticationFilter = new JWTAuthenticationFilter(jwtTokenUtil, userDetailsService);
|
|
|
+
|
|
|
// 将自定义的Filter添加到Spring Security过滤器链中
|
|
|
+ http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
|
|
|
http.addFilter(authenticationFilter);
|
|
|
|
|
|
return http.build();
|
|
|
@@ -83,4 +94,5 @@ public class SecurityConfig {
|
|
|
return new BCryptPasswordEncoder();
|
|
|
}
|
|
|
|
|
|
+
|
|
|
}
|