Когда я делаю запрос получить запрос на демонстрацию конечной точки с истекшим токеном 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
Программисты JAVA общаются здесь
1738243290
Anonymous
Когда я делаю запрос получить запрос на демонстрацию конечной точки с истекшим токеном 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);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79399998/why-doesnt-restcontrolleradvice-handle-expired-jwt-exceptions-thrown-from-jwta[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия