Я разрабатываю приложение Spring Boot и сталкиваюсь с периодическими ответами 500 Internal Server Error на определенные запросы GET. Проблема непоследовательна, то есть одна и та же конечная точка может иногда работать, а иногда давать сбой.
Мой код:
import org.springframework.http.HttpHeaders;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@Component
public class AuthenticationFilter extends OncePerRequestFilter {
private final JwtService jwtService;
public AuthenticationFilter(JwtService jwtService) {
this.jwtService = jwtService;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, java.io.IOException {
// Get token from the Authorization header
String jws = request.getHeader(HttpHeaders.AUTHORIZATION);
if (jws != null) {
// Verify token and get user
String user = jwtService.getAuthUser(request);
// Authenticate
Authentication authentication = new UsernamePasswordAuthenticationToken(user, null,
java.util.Collections.emptyList());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}
}
package com.marvi.DeliApp.Security;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Date;
@Component
public class JwtService {
static final long EXPIRATIONTIME = 86400000; // 1 day
static final String PREFIX = "Bearer";
static final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
// Generate signed JWT token
public String getToken(String username) {
String token = Jwts.builder().setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME)).signWith(key).compact();
return token;
}
// Get user from token
public String getAuthUser(HttpServletRequest request) {
String token = request.getHeader(HttpHeaders.AUTHORIZATION);
if (token != null) {
String user = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token.replace(PREFIX, ""))
.getBody().getSubject();
if (user != null)
return user;
}
return null;
}
}
Я оставил комментарий, чтобы проверить, но у меня возникли проблемы
import com.marvi.DeliApp.Service.UserDetailsServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import java.util.Arrays;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
private final UserDetailsServiceImpl userDetailsService;
private final AuthenticationFilter authenticationFilter;
private final AuthEntryPoint exceptionHandler;
public SecurityConfig(UserDetailsServiceImpl userDetailsService, AuthenticationFilter authenticationFilter,
AuthEntryPoint exceptionHandler) {
this.userDetailsService = userDetailsService;
this.authenticationFilter = authenticationFilter;
this.exceptionHandler = exceptionHandler;
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception {
return authConfig.getAuthenticationManager();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf((csrf) -> csrf.disable()).cors(withDefaults())
.authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests
.anyRequest().permitAll());
/*http.csrf((csrf) -> csrf.disable()).cors(withDefaults())
.sessionManagement(
(sessionManagement) -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests
.requestMatchers(HttpMethod.POST, "/login").permitAll()
.anyRequest().authenticated())
.oauth2Login(withDefaults())
.addFilterBefore(authenticationFilter, UsernamePasswordAuthenticationFilter.class)
.exceptionHandling(exceptionHandling -> exceptionHandling.authenticationEntryPoint(exceptionHandler));*/
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowedOrigins(Arrays.asList("*"));
config.setAllowedMethods(Arrays.asList("*"));
config.setAllowedHeaders(Arrays.asList("*"));
config.setAllowCredentials(false);
config.applyPermitDefaultValues();
source.registerCorsConfiguration("/**", config);
return source;
}
}
Я ожидал, что приложение обработает запросы GET к конечной точке /menuItems без возникновения внутренней ошибки сервера 500.
Это журнал:
2024-07-03T03:38:29.497-04:00 INFO 42414 --- [myapp] [main] m.p.springdotenv.DotenvPropertySource : Initializing Dotenv with DotenvConfig{directory=null, filename=null, ignoreIfMalformed=false, ignoreIfMissing=true, systemProperties=false, prefix=null}
2024-07-03T03:38:29.512-04:00 INFO 42414 --- [myapp] [main] com.marvi.myapp.myappApplication : Starting myappApplication using Java 17.0.11 with PID 42414
2024-07-03T03:38:29.513-04:00 INFO 42414 --- [myapp] [main] com.marvi.myapp.myappApplication : No active profile set, falling back to 1 default profile: "default"
2024-07-03T03:38:30.282-04:00 INFO 42414 --- [myapp] [main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2024-07-03T03:38:30.318-04:00 INFO 42414 --- [myapp] [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2024-07-03T03:38:30.319-04:00 INFO 42414 --- [myapp] [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 779 ms
2024-07-03T03:38:30.413-04:00 INFO 42414 --- [myapp] [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2024-07-03T03:38:30.441-04:00 INFO 42414 --- [myapp] [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.2.Final
2024-07-03T03:38:30.456-04:00 INFO 42414 --- [myapp] [main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled
2024-07-03T03:38:30.596-04:00 INFO 42414 --- [myapp] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2024-07-03T03:38:30.688-04:00 INFO 42414 --- [myapp] [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@21a5b599
2024-07-03T03:38:30.688-04:00 INFO 42414 --- [myapp] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2024-07-03T03:38:31.203-04:00 WARN 42414 --- [myapp] [main] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL "alter table if exists menu_item add column featured boolean not null" via JDBC [ERROR: column "featured" of relation "menu_item" contains null values]
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "alter table if exists menu_item add column featured boolean not null" via JDBC [ERROR: column "featured" of relation "menu_item" contains null values]
2024-07-03T03:39:04.219-04:00 WARN 42414 --- [myapp] [nio-8080-exec-4] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 42703
2024-07-03T03:39:04.219-04:00 ERROR 42414 --- [myapp] [nio-8080-exec-4] o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: column mi1_0.featured does not exist
Position: 69
2024-07-03T03:38:31.639-04:00 TRACE 42414 --- [myapp] [main] eGlobalAuthenticationAutowiredConfigurer : Eagerly initializing {securityConfig=com.marvi.myapp.Security.SecurityConfig$$SpringCGLIB$$0@39a6c7a6}
2024-07-03T03:38:31.643-04:00 INFO 42414 --- [myapp] [main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name userDetailsServiceImpl
2024-07-03T03:38:32.550-04:00 DEBUG 42414 --- [myapp] [main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with filters: DisableEncodeUrlFilter, WebAsyncManagerIntegrationFilter, SecurityContextHolderFilter, HeaderWriterFilter, CorsFilter, LogoutFilter, RequestCacheAwareFilter, SecurityContextHolderAwareRequestFilter, AnonymousAuthenticationFilter, ExceptionTranslationFilter, AuthorizationFilter
2024-07-03T03:38:51.716-04:00 TRACE 42414 --- [myapp] [nio-8080-exec-2] w.c.HttpSessionSecurityContextRepository : No HttpSession currently exists
2024-07-03T03:38:51.716-04:00 TRACE 42414 --- [myapp] [nio-8080-exec-2] .s.s.w.c.SupplierDeferredSecurityContext : Created SecurityContextImpl [Null authentication]
2024-07-03T03:38:51.716-04:00 TRACE 42414 --- [myapp] [nio-8080-exec-2] .s.s.w.c.SupplierDeferredSecurityContext : Created SecurityContextImpl [Null authentication]
2024-07-03T03:38:51.717-04:00 TRACE 42414 --- [myapp] [nio-8080-exec-2] o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to AnonymousAuthenticationToken [Principal=anonymousUser, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=null], Granted Authorities=[ROLE_ANONYMOUS]]
Подробнее здесь: https://stackoverflow.com/questions/787 ... entication