Когда я делаю запрос получить запрос на демонстрацию конечной точки с истекшим токеном jwt, я получаю 403 запрещено. Также я получаю ошибку в консоли. < /p>
Это ошибка, которую я получаю в консоли. : < /p>
2025-01-30T16:46:27.928+04:00 ERROR 3173 --- [MyStoreAuth] [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
io.jsonwebtoken.ExpiredJwtException: JWT expired 170708927 milliseconds ago at 2025-01-28T13:21:19.000Z. Current time: 2025-01-30T12:46:27.927Z. Allowed clock skew: 0 milliseconds.
< /code>
Я не хочу получать ошибку в консоли и давать пользовательский ответ ошибке. Я попытался сделать это, добавив ошибку в jwtauthfilter и обработав ее @RestControllerAdvice, но это не работает. Я хочу спросить, почему это не работает, когда я бросаю ошибку из jwtauthfilter, но другие ошибки, которые я добавляю из файлов контроллера, обрабатываются @restcontrolleradvice.
Вот мой код:
democontroller < /p>
@RestController
@RequestMapping("/api/v1/demo")
public class DemoController {
@GetMapping("")
public ResponseEntity sayHello() {
return ResponseEntity.ok("hi bro");
}
}
< / code>
SecurityConfig < / p>
@Configuration
@EnableWebSecurity
@AllArgsConstructor
public class SecurityConfig {
private final AuthenticationProvider authenticationProvider;
private JwtAuthFilter jwtAuthFilter;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
return httpSecurity
.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(auth -> auth
.requestMatchers("api/v1/auth/**").permitAll()
.anyRequest().authenticated()
)
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.authenticationProvider(authenticationProvider)
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
}
< /code>
globalexceptionHandler < /p>
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(AuthenticationFailedException.class)
public ResponseEntity handleAuthenticationFailedExceptions(AuthenticationFailedException ex) {
ErrorResponse errorResponse = new ErrorResponse(
HttpStatus.UNAUTHORIZED.value(),
"Authentication Failed",
ex.getMessage()
);
return new ResponseEntity(errorResponse, HttpStatus.UNAUTHORIZED);
}
@ExceptionHandler(BadRequestException.class)
public ResponseEntity handleBadRequestExceptions(BadRequestException ex) {
ErrorResponse errorResponse = new ErrorResponse(
HttpStatus.BAD_REQUEST.value(),
"Bad Request",
ex.getMessage()
);
return new ResponseEntity(errorResponse, HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity handleValidationExceptions(MethodArgumentNotValidException ex) {
ErrorResponse errorResponse = new ErrorResponse(
HttpStatus.BAD_REQUEST.value(),
"Bad Request",
Objects.requireNonNull(ex.getBindingResult().getFieldError()).getDefaultMessage()
);
return new ResponseEntity(errorResponse, HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(InvalidTokenException.class)
public ResponseEntity handleInvalidTokenExceptions(InvalidTokenException ex) {
ErrorResponse errorResponse = new ErrorResponse(
HttpStatus.UNAUTHORIZED.value(),
"Unauthorized",
ex.getMessage()
);
return new ResponseEntity(errorResponse, HttpStatus.UNAUTHORIZED);
}
}
< /code>
jwtauthfilter < /p>
@Component
@AllArgsConstructor
public class JwtAuthFilter extends OncePerRequestFilter {
private final JwtService jwtService;
private AppUserService appUserService;
@Override
protected void doFilterInternal(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull FilterChain filterChain) throws ServletException, IOException {
final String authHeader = request.getHeader("Authorization");
final String jwtToken;
final String userEmail;
if (authHeader == null || !authHeader.startsWith("Bearer")) {
filterChain.doFilter(request, response);
return;
}
jwtToken = authHeader.substring(7);
userEmail = jwtService.extractUsername(jwtToken);
if (userEmail != null && SecurityContextHolder.getContext().getAuthentication() == null) {
UserDetails userDetails = this.appUserService.loadUserByUsername(userEmail);
try {
jwtService.isTokenValid(jwtToken, userDetails);
UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authToken);
} catch (ExpiredJwtException e) {
throw new InvalidTokenException("Expired token");
} catch (JwtException e) {
throw new InvalidTokenException("Invalid token");
}
}
filterChain.doFilter(request, response);
}
}
< /code>
jwtservice < /p>
@Service
public class JwtService {
public String extractUsername(String token) {
Claims claims = extractAllClaims(token);
return claims.getSubject();
}
public Date extractExpiration(String token) {
Claims claims = extractAllClaims(token);
return claims.getExpiration();
}
public String generateToken(UserDetails userDetails) {
return generateToken(new HashMap(), userDetails);
}
public String generateToken(Map extraClaims, UserDetails userDetails) {
return Jwts
.builder()
.claims(extraClaims)
.subject(userDetails.getUsername())
.issuedAt(new Date(System.currentTimeMillis()))
.expiration(new Date(System.currentTimeMillis() + 1000 * 60 * 24))
.signWith(getSignInKey(), Jwts.SIG.HS256)
.compact();
}
public boolean isTokenValid(String token, UserDetails userDetails) {
final String username = extractUsername(token);
return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
}
private boolean isTokenExpired(String token) {
return extractExpiration(token).before(new Date());
}
private Claims extractAllClaims(String token) {
return Jwts
.parser()
.verifyWith(getSignInKey())
.build()
.parseSignedClaims(token)
.getPayload();
}
private SecretKey getSignInKey() {
byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
return Keys.hmacShaKeyFor(keyBytes);
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... -from-jwta
Почему @RestControllerAdvice Handle Harder истек jwt исключения, выброшенные из jwtauthfilter? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Для покрытия кода, как убедиться, что функции, выброшенные линкером, осмотрены
Anonymous » » в форуме Linux - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Spring Security: ApikeyauthenticationFilter не выполняет до jwtauthfilter в Api Gateway
Anonymous » » в форуме JAVA - 0 Ответы
- 80 Просмотры
-
Последнее сообщение Anonymous
-