簡體   English   中英

Spring Boot 3 with Spring Security Intercepts exceptions 我不希望它

[英]Spring Boot 3 with Spring Security Intercepts exceptions I don't want it to

我正在使用 Spring Boot 3.0.2 和 Spring Security 構建一個 API,我已經構建了安全過濾器鏈,它在阻止未經身份驗證的請求方面運行良好。 但是我有一個接受application/jsonRestController 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM