java - Spring:REST 异常被捕获为 403 Forbidden 异常

标签 java spring exception

我创建了一个带有自定义 JWT 身份验证的 Spring Boot Rest Api(有一天我会使用 Keycloak 进行更改)。

自定义过滤器是这样的:

public class JwtAuthenticationFilter extends OncePerRequestFilter {

    private final JwtService jwtService;

    private final UserDetailsService userDetailsService;

    @Override
    protected void doFilterInternal(
            @NonNull HttpServletRequest request,
            @NonNull HttpServletResponse response,
            @NonNull FilterChain filterChain
    ) throws ServletException, IOException {
        final String authHeader = request.getHeader("Authorization");
        final String jwt;
        final String userEmail;
        if(authHeader == null || !authHeader.startsWith("Bearer ")){
            filterChain.doFilter(request, response);
            return;
        }
        // Extract token
        jwt = authHeader.substring(7);
        // Extract username or email from JWT token
        userEmail = jwtService.extractUsername(jwt);
        if(userEmail != null && SecurityContextHolder.getContext().getAuthentication() == null){
            UserDetails userDetails = this.userDetailsService.loadUserByUsername(userEmail);
            if(jwtService.isTokenValid(jwt, userDetails)){
                UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(
                        userDetails,
                        null,
                        userDetails.getAuthorities()
                );
                authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                SecurityContextHolder.getContext().setAuthentication(authToken);
            }
        }
        filterChain.doFilter(request, response);
    }
}

安全配置:

public class SecurityConfiguration {

    private final JwtAuthenticationFilter jwtAuthFilter;
    private final AuthenticationProvider authenticationProvider;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception{
        
        httpSecurity
                .csrf()
                .disable()
                .authorizeHttpRequests()
                .requestMatchers("/api/v1/auth/**")
                .permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authenticationProvider(authenticationProvider)
                .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
        
        return httpSecurity.build();
    }
    
}

问题是,当我在运行时遇到任何异常(IllegalArgumentException、RuntimeException 等)时,所有异常都会以“403 Forbidden”的形式返回给调用者。 我想将实际的异常返回给调用者。

我在这里缺少什么?

最佳答案

您需要允许访问/error

.requestMatchers("/api/v1/auth/**", "/error").permitAll()

关于java - Spring:REST 异常被捕获为 403 Forbidden 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75237129/

相关文章:

java - 尝试从 Spring Tool Suite IDE 重新部署项目时,8080 端口已经出现问题

Spring Boot JPA findByUuid

mysql - 如果抛出错误,是否需要释放连接?

c# - ExecuteScalar "Specified cast is not valid"异常

java - Eclipse:导入javacard无法解析

java - 如何初始化 snmp V3 参数以使用 AdventNet 获取 snmpV3 陷阱

java - org.hibernate.MappingException : Could not determine typ

java - 使用 BufferedReader 读取错误

java - 在 Thymeleaf 中添加表单

c++ - 如何确定 catch (...) block 中的当前异常?