Spring Boot 3.x中为·Spring Security自定义错误输出
Spring Security 抛出的异常都是403, 而且只有状态码,没有输出,需要对其自定义,6.0后写法有些变动,记录一下:
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfigurer {
private final JWTAuthenticationFilter jwtAuthenticationFilter;
private final IUserService userService;
@Bean
public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(requests -> requests
.antMatchers("/api/**").permitAll()
.anyRequest().authenticated()
)
.sessionManagement(manager -> manager.sessionCreationPolicy(STATELESS))
.authenticationProvider(authenticationProvider())
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
.exceptionHandling(exceptionHandling ->
exceptionHandling
.authenticationEntryPoint(authenticationEntryPoint())
.accessDeniedHandler(accessDeniedHandler())
);
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public AuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userService.userDetailsService());
authProvider.setPasswordEncoder(passwordEncoder());
return authProvider;
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration config)
throws Exception {
return config.getAuthenticationManager();
}
@Bean
public AuthenticationEntryPoint authenticationEntryPoint() {
return (request, response, authException) -> {
System.out.println(authException.getClass());
System.out.println(authException.getMessage());
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/plain;charset=UTF-8");
response.getWriter().write(JSON.toJSONString(ExceptionResponse.builder()
.status(HttpServletResponse.SC_UNAUTHORIZED)
.error("身份验证失败,尚未登录或凭证已过期")
.build()));
};
}
@Bean
public AccessDeniedHandler accessDeniedHandler() {
return (request, response, accessDeniedException) -> {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/plain;charset=UTF-8");
response.getWriter().write(JSON.toJSONString(ExceptionResponse.builder()
.status(HttpServletResponse.SC_FORBIDDEN)
.error("您尚未被授权执行此操作")
.build()));
};
}
发表回复