[英]Spring Boot 3 with Spring Security Intercepts exceptions I don't want it to
我正在使用 Spring Boot 3.0.2 和 Spring Security 構建一個 API,我已經構建了安全過濾器鏈,它在阻止未經身份驗證的請求方面運行良好。 但是我有一個接受application/json
的RestController
class,如果我沒有正確提供內容類型 header,我希望返回 415 狀態代碼。 在沒有 Spring 安全的情況下,它可以正常返回。 但是對於 Spring Security,它似乎被攔截並返回了 403。
WebSecurityConfig
:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.cors().and()
.csrf().disable()
.authorizeHttpRequests(auth -> auth
.requestMatchers("/auth**").permitAll()
.anyRequest().authenticated())
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class)
.userDetailsService(jpaUserDetailsService)
.build();
}
授權過濾器:
@Component
@RequiredArgsConstructor
public class JwtAuthFilter extends OncePerRequestFilter {
private final JwtUtils jwtUtils;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String jwtToken = request.getHeader(AUTHENTICATION_HEADER);
if (jwtToken != null && jwtToken.startsWith("Bearer ")) {
jwtToken = jwtToken.split(" ")[1];
if (jwtUtils.isValidToken(jwtToken)) {
UserDetails userDetails = new UserSecurity(jwtUtils.extractUser(jwtToken));
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(userDetails,
null, userDetails.getAuthorities());
auth.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(auth);
}
}
filterChain.doFilter(request, response);
}
}
Rest Controller:
@RestController
@RequestMapping(value = "auth", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public class AuthController {
@GetMapping
public Object test() {
Map<String, String> test = new HashMap<>();
test.put("key", "val");
return test;
}
}
如果它實際上是一個未經身份驗證的錯誤,有沒有辦法只返回 403 異常? 不是針對每一個例外?
您必須允許 URL /error 才能看到錯誤。
您必須打開錯誤端點,請參閱Spring Boot 2.0 遷移指南:
默認安全
安全自動配置不再公開選項並盡可能使用 Spring 安全默認值。 一個明顯的副作用是使用 Spring Security 的內容協商進行授權(表單登錄)。
Spring Boot 2.0 與 Spring Security 的默認設置沒有太大偏差,因此一些在 Spring Boot 1.5 中繞過 Spring Security 的端點現在默認是安全的。 其中包括錯誤端點和 static 資源的路徑,例如
/css/**
、/js/**
、/images/**
、/webjars/**
、/**/favicon.ico
。 如果你想打開它們,你需要明確地配置它。
您修改后的安全鏈配置:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.cors().and()
.csrf().disable()
.authorizeHttpRequests(auth -> auth
.requestMatchers("/error").permitAll()
.requestMatchers("/auth**").permitAll()
.anyRequest().authenticated())
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class)
.userDetailsService(jpaUserDetailsService)
.build();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.