До сих пор я в основном работал с C# и ASP.NET, но теперь мне нужно написать веб-API на Java Spring. Я совершенно новичок в этой среде и не могу справиться с аутентификацией токена JWT, для меня это выглядит как черная магия. Если я открываю конечную точку для анонимного пользователя, они работают нормально, но когда я пытаюсь потребовать аутентификацию, я всегда получаю код состояния 401 Unauthorized, даже если я передаю действительный токен JWT в своем запросе. Это мой класс конфигурации безопасности:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
private final JwtAuthEntryPoint authEntryPoint;
private final UserDetailsServiceImpl userDetailsService;
@Autowired
public SecurityConfig(JwtAuthEntryPoint authEntryPoint, UserDetailsServiceImpl userDetailsService) {
this.authEntryPoint = authEntryPoint;
this.userDetailsService = userDetailsService;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.exceptionHandling(e -> {
e.authenticationEntryPoint(authEntryPoint);
})
.authorizeHttpRequests(r -> {
r.requestMatchers(HttpMethod.POST, "/api/authentication/respondents").authenticated();
})
.httpBasic(Customizer.withDefaults());
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
return http.build();
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration)
throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public Filter jwtAuthenticationFilter() {
return new JwtAuthenticationFilter();
}
}
Мой поставщик токенов
@Component
public class TokenProvider {
private final SecuritySettings securitySettings;
@Autowired
public TokenProvider(SecuritySettings securitySettings) {
this.securitySettings = securitySettings;
}
public String generateToken(Authentication authentication){
String username = authentication.getName();
Date curretDate = new Date();
int expiration = securitySettings.getExpiration();
Date expireDate = new Date(curretDate.getTime() + expiration);
String token = Jwts.builder()
.setSubject(username)
.setIssuedAt(curretDate)
.setExpiration(expireDate)
.signWith(SignatureAlgorithm.HS512, securitySettings.getKey())
.compact();
return token;
}
public String getUsernameFromJwt(String token){
Claims claims = Jwts.parser()
.setSigningKey(securitySettings.getKey())
.parseClaimsJws(token)
.getBody();
return claims.getSubject();
}
public boolean validateToken(String token){
try{
Jwts.parser()
.setSigningKey(securitySettings.getKey())
.parseClaimsJws(token);
return true;
} catch (Exception e){
throw new AuthenticationCredentialsNotFoundException("Jwt was expired or incorrect");
}
}
}
Фильтр аутентификации:
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Autowired
private TokenProvider tokenProvider;
@Autowired
private UserDetailsServiceImpl userDetailsService;
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain)
throws ServletException, IOException {
String token = getJWTFromRequest(request);
if (StringUtils.hasText(token) && tokenProvider.validateToken(token)){
String username = tokenProvider.getUsernameFromJwt(token);
UserDetails user = userDetailsService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user,
user.getAuthorities());
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
filterChain.doFilter(request, response);
}
private String getJWTFromRequest(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")){
return bearerToken.substring(7, bearerToken.length());
}
return null;
}
}
реализация службы сведений о пользователях:
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
private IdentityUserRepository identityUserRepository;
@Autowired
public UserDetailsServiceImpl(IdentityUserRepository identityUserRepository) {
this.identityUserRepository = identityUserRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
IdentityUser databaseUser = identityUserRepository
.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("Username not found"));
return new User(databaseUser.getUsername(), databaseUser.getPasswordHash(), mapRolesToAuthorities(databaseUser));
}
private List mapRolesToAuthorities(IdentityUser user){
List authorities = new ArrayList();
authorities.add(new SimpleGrantedAuthority("ROLE_" + user.getRole()));
return authorities;
}
}
Я потратил около 15 часов, пытаясь найти некоторую информацию и решить эту проблему, но ничего не помогло. Единственное, что я обнаружил, это то, что я всегда добираюсь до этой точки входа:
@Component
public class JwtAuthEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authException.getMessage());
}
}
И я думаю, отсюда возвращается 401. В сообщении об исключении говорится: «Для доступа к этому ресурсу требуется полная аутентификация»... Я был бы очень благодарен, если бы кто-нибудь мне помог. Возможно, я также упомяну, что моя цель — ограничить конечную точку пользователями с правами администратора с помощью hasRole("ADMIN") (это также оставляет меня с 401). И чтобы внести ясность: токен носителя JWT, переданный в заголовке аутентификации, действителен.
Журналы (может быть полезны):
[2024-07-05 21:46:18.240] [ERROR] [http-nio-auto-1-exec-1] c.s.api.handlers.GlobalExceptionHandler - Full authentication is required to access this resource org.springframework.security.authentication.InsufficientAuthenticationException: F u l l a u t h e n t i c a t i o n i s r e q u i r e d t o a c c e s s t h i s r e s o u r c e < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a c c e s s . E x c e p t i o n T r a n s l a t i o n F i l t e r . h a n d l e A c c e s s D e n i e d E x c e p t i o n ( E x c e p t i o n T r a n s l a t i o n F i l t e r . j a v a : 1 9 9 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a c c e s s . E x c e p t i o n T r a n s l a t i o n F i l t e r . h a n d l e S p r i n g S e c u r i t y E x c e p t i o n ( E x c e p t i o n T r a n s l a t i o n F i l t e r . j a v a : 1 7 8 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a c c e s s . E x c e p t i o n T r a n s l a t i o n F i l t e r . d o F i l t e r ( E x c e p t i o n T r a n s l a t i o n F i l t e r . j a v a : 1 4 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a c c e s s . E x c e p t i o n T r a n s l a t i o n F i l t e r . d o F i l t e r ( E x c e p t i o n T r a n s l a t i o n F i l t e r . j a v a : 1 2 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a u t h e n t i c a t i o n . A n o n y m o u s A u t h e n t i c a t i o n F i l t e r . d o F i l t e r ( A n o n y m o u s A u t h e n t i c a t i o n F i l t e r . j a v a : 1 0 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . s e r v l e t a p i . S e c u r i t y C o n t e x t H o l d e r A w a r e R e q u e s t F i l t e r . d o F i l t e r ( S e c u r i t y C o n t e x t H o l d e r A w a r e R e q u e s t F i l t e r . j a v a : 1 7 9 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . s a v e d r e q u e s t . R e q u e s t C a c h e A w a r e F i l t e r . d o F i l t e r ( R e q u e s t C a c h e A w a r e F i l t e r . j a v a : 6 3 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . w e b . f i l t e r . O n c e P e r R e q u e s t F i l t e r . d o F i l t e r ( O n c e P e r R e q u e s t F i l t e r . j a v a : 1 0 1 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . w e b . f i l t e r . O n c e P e r R e q u e s t F i l t e r . d o F i l t e r ( O n c e P e r R e q u e s t F i l t e r . j a v a : 1 0 1 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a u t h e n t i c a t i o n . l o g o u t . L o g o u t F i l t e r . d o F i l t e r ( L o g o u t F i l t e r . j a v a : 1 0 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a u t h e n t i c a t i o n . l o g o u t . L o g o u t F i l t e r . d o F i l t e r ( L o g o u t F i l t e r . j a v a : 9 3 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . w e b . f i l t e r . O n c e P e r R e q u e s t F i l t e r . d o F i l t e r ( O n c e P e r R e q u e s t F i l t e r . j a v a : 1 0 1 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . w e b . f i l t e r . O n c e P e r R e q u e s t F i l t e r . d o F i l t e r ( O n c e P e r R e q u e s t F i l t e r . j a v a : 1 0 1 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . c o n t e x t . S e c u r i t y C o n t e x t H o l d e r F i l t e r . d o F i l t e r ( S e c u r i t y C o n t e x t H o l d e r F i l t e r . j a v a : 8 2 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . c o n t e x t . S e c u r i t y C o n t e x t H o l d e r F i l t e r . d o F i l t e r ( S e c u r i t y C o n t e x t H o l d e r F i l t e r . j a v a : 6 9 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . w e b . f i l t e r . O n c e P e r R e q u e s t F i l t e r . d o F i l t e r ( O n c e P e r R e q u e s t F i l t e r . j a v a : 1 0 1 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 227)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:323)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:224)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195)
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:642)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:410)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:340)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:277)
at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:362)
at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:222)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
at java.base/java.lang.Thread.run(Thread.java:842)
Подробнее здесь: https://stackoverflow.com/questions/787 ... ssed-a-val
«Для доступа к этому ресурсу требуется полная аутентификация» даже при передаче действующего токена JWT. ⇐ JAVA
Программисты JAVA общаются здесь
1720210373
Anonymous
До сих пор я в основном работал с C# и ASP.NET, но теперь мне нужно написать веб-API на Java Spring. Я совершенно новичок в этой среде и не могу справиться с аутентификацией токена JWT, для меня это выглядит как черная магия. Если я открываю конечную точку для анонимного пользователя, они работают нормально, но когда я пытаюсь потребовать аутентификацию, я всегда получаю код состояния 401 Unauthorized, даже если я передаю действительный токен JWT в своем запросе. Это мой класс конфигурации безопасности:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
private final JwtAuthEntryPoint authEntryPoint;
private final UserDetailsServiceImpl userDetailsService;
@Autowired
public SecurityConfig(JwtAuthEntryPoint authEntryPoint, UserDetailsServiceImpl userDetailsService) {
this.authEntryPoint = authEntryPoint;
this.userDetailsService = userDetailsService;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.exceptionHandling(e -> {
e.authenticationEntryPoint(authEntryPoint);
})
.authorizeHttpRequests(r -> {
r.requestMatchers(HttpMethod.POST, "/api/authentication/respondents").authenticated();
})
.httpBasic(Customizer.withDefaults());
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
return http.build();
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration)
throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public Filter jwtAuthenticationFilter() {
return new JwtAuthenticationFilter();
}
}
Мой поставщик токенов
@Component
public class TokenProvider {
private final SecuritySettings securitySettings;
@Autowired
public TokenProvider(SecuritySettings securitySettings) {
this.securitySettings = securitySettings;
}
public String generateToken(Authentication authentication){
String username = authentication.getName();
Date curretDate = new Date();
int expiration = securitySettings.getExpiration();
Date expireDate = new Date(curretDate.getTime() + expiration);
String token = Jwts.builder()
.setSubject(username)
.setIssuedAt(curretDate)
.setExpiration(expireDate)
.signWith(SignatureAlgorithm.HS512, securitySettings.getKey())
.compact();
return token;
}
public String getUsernameFromJwt(String token){
Claims claims = Jwts.parser()
.setSigningKey(securitySettings.getKey())
.parseClaimsJws(token)
.getBody();
return claims.getSubject();
}
public boolean validateToken(String token){
try{
Jwts.parser()
.setSigningKey(securitySettings.getKey())
.parseClaimsJws(token);
return true;
} catch (Exception e){
throw new AuthenticationCredentialsNotFoundException("Jwt was expired or incorrect");
}
}
}
Фильтр аутентификации:
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Autowired
private TokenProvider tokenProvider;
@Autowired
private UserDetailsServiceImpl userDetailsService;
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain)
throws ServletException, IOException {
String token = getJWTFromRequest(request);
if (StringUtils.hasText(token) && tokenProvider.validateToken(token)){
String username = tokenProvider.getUsernameFromJwt(token);
UserDetails user = userDetailsService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user,
user.getAuthorities());
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
filterChain.doFilter(request, response);
}
private String getJWTFromRequest(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")){
return bearerToken.substring(7, bearerToken.length());
}
return null;
}
}
реализация службы сведений о пользователях:
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
private IdentityUserRepository identityUserRepository;
@Autowired
public UserDetailsServiceImpl(IdentityUserRepository identityUserRepository) {
this.identityUserRepository = identityUserRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
IdentityUser databaseUser = identityUserRepository
.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("Username not found"));
return new User(databaseUser.getUsername(), databaseUser.getPasswordHash(), mapRolesToAuthorities(databaseUser));
}
private List mapRolesToAuthorities(IdentityUser user){
List authorities = new ArrayList();
authorities.add(new SimpleGrantedAuthority("ROLE_" + user.getRole()));
return authorities;
}
}
Я потратил около 15 часов, пытаясь найти некоторую информацию и решить эту проблему, но ничего не помогло. Единственное, что я обнаружил, это то, что я всегда добираюсь до этой точки входа:
@Component
public class JwtAuthEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authException.getMessage());
}
}
И я думаю, отсюда возвращается 401. В сообщении об исключении говорится: «Для доступа к этому ресурсу требуется полная аутентификация»... Я был бы очень благодарен, если бы кто-нибудь мне помог. Возможно, я также упомяну, что моя цель — ограничить конечную точку пользователями с правами администратора с помощью hasRole("ADMIN") (это также оставляет меня с 401). И чтобы внести ясность: токен носителя JWT, переданный в заголовке аутентификации, действителен.
Журналы (может быть полезны):
[2024-07-05 21:46:18.240] [ERROR] [http-nio-auto-1-exec-1] c.s.api.handlers.GlobalExceptionHandler - Full authentication is required to access this resource org.springframework.security.authentication.InsufficientAuthenticationException: F u l l a u t h e n t i c a t i o n i s r e q u i r e d t o a c c e s s t h i s r e s o u r c e < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a c c e s s . E x c e p t i o n T r a n s l a t i o n F i l t e r . h a n d l e A c c e s s D e n i e d E x c e p t i o n ( E x c e p t i o n T r a n s l a t i o n F i l t e r . j a v a : 1 9 9 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a c c e s s . E x c e p t i o n T r a n s l a t i o n F i l t e r . h a n d l e S p r i n g S e c u r i t y E x c e p t i o n ( E x c e p t i o n T r a n s l a t i o n F i l t e r . j a v a : 1 7 8 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a c c e s s . E x c e p t i o n T r a n s l a t i o n F i l t e r . d o F i l t e r ( E x c e p t i o n T r a n s l a t i o n F i l t e r . j a v a : 1 4 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a c c e s s . E x c e p t i o n T r a n s l a t i o n F i l t e r . d o F i l t e r ( E x c e p t i o n T r a n s l a t i o n F i l t e r . j a v a : 1 2 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a u t h e n t i c a t i o n . A n o n y m o u s A u t h e n t i c a t i o n F i l t e r . d o F i l t e r ( A n o n y m o u s A u t h e n t i c a t i o n F i l t e r . j a v a : 1 0 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . s e r v l e t a p i . S e c u r i t y C o n t e x t H o l d e r A w a r e R e q u e s t F i l t e r . d o F i l t e r ( S e c u r i t y C o n t e x t H o l d e r A w a r e R e q u e s t F i l t e r . j a v a : 1 7 9 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . s a v e d r e q u e s t . R e q u e s t C a c h e A w a r e F i l t e r . d o F i l t e r ( R e q u e s t C a c h e A w a r e F i l t e r . j a v a : 6 3 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . w e b . f i l t e r . O n c e P e r R e q u e s t F i l t e r . d o F i l t e r ( O n c e P e r R e q u e s t F i l t e r . j a v a : 1 0 1 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . w e b . f i l t e r . O n c e P e r R e q u e s t F i l t e r . d o F i l t e r ( O n c e P e r R e q u e s t F i l t e r . j a v a : 1 0 1 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a u t h e n t i c a t i o n . l o g o u t . L o g o u t F i l t e r . d o F i l t e r ( L o g o u t F i l t e r . j a v a : 1 0 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . a u t h e n t i c a t i o n . l o g o u t . L o g o u t F i l t e r . d o F i l t e r ( L o g o u t F i l t e r . j a v a : 9 3 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . w e b . f i l t e r . O n c e P e r R e q u e s t F i l t e r . d o F i l t e r ( O n c e P e r R e q u e s t F i l t e r . j a v a : 1 0 1 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . w e b . f i l t e r . O n c e P e r R e q u e s t F i l t e r . d o F i l t e r ( O n c e P e r R e q u e s t F i l t e r . j a v a : 1 0 1 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . c o n t e x t . S e c u r i t y C o n t e x t H o l d e r F i l t e r . d o F i l t e r ( S e c u r i t y C o n t e x t H o l d e r F i l t e r . j a v a : 8 2 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . c o n t e x t . S e c u r i t y C o n t e x t H o l d e r F i l t e r . d o F i l t e r ( S e c u r i t y C o n t e x t H o l d e r F i l t e r . j a v a : 6 9 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 2 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ V i r t u a l F i l t e r C h a i n . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 1 3 7 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . w e b . f i l t e r . O n c e P e r R e q u e s t F i l t e r . d o F i l t e r ( O n c e P e r R e q u e s t F i l t e r . j a v a : 1 0 1 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . w r a p F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 2 4 0 ) < b r / > a t o r g . s p r i n g f r a m e w o r k . s e c u r i t y . w e b . O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r $ O b s e r v a t i o n F i l t e r . d o F i l t e r ( O b s e r v a t i o n F i l t e r C h a i n D e c o r a t o r . j a v a : 227)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:323)
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:224)
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195)
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:642)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:410)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:340)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:277)
at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:362)
at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:222)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
at java.base/java.lang.Thread.run(Thread.java:842)
Подробнее здесь: [url]https://stackoverflow.com/questions/78708519/full-authentication-is-required-to-access-this-resource-even-with-passed-a-val[/url]
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
«Для доступа к этому ресурсу требуется полная аутентификация» даже при передаче действующего токена JWT.
Anonymous » » в форуме JAVAДо сих пор я в основном работал с C# и ASP.NET, но теперь мне нужно написать веб-API на Java Spring. Я совершенно новичок в этой среде и не могу справиться с аутентификацией токена JWT, для меня это выглядит как черная магия. Если я открываю... - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Spring Boot с JWT: для доступа к этому ресурсу требуется полная аутентификация
Anonymous » » в форуме JAVAУ меня есть этот контроллер:
@GetMapping( /daily )
@PreAuthorize( hasRole('BASIC') )
public ResponseEntity dailyT(
@RequestHeader(value = Authorization ) String authHeader)
throws UnirestException, JsonProcessingException {
....
}
Этот класс:... - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Выброс Spring Security: InsufficientAuthenticationException: для доступа к этому ресурсу требуется полная аутентификация
Anonymous » » в форуме JAVAДо сегодняшнего дня я без проблем работал с Spring 2.x.x. Теперь я пытаюсь создать API для отдыха с включенной защитой Spring (spring boot 3.3.1), и я хочу использовать аутентификацию HttpBasic. Итак, я просто настроил свой проект и начал... - 0 Ответы
- 43 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Несанкционированная ошибка: для доступа к этому ресурсу требуется полная аутентификация с помощью Spring.security v.6.
Anonymous » » в форуме JAVAИтак, я новичок в Spring Security и пытался создать приложение Spring Boot со службами REST, а также реализовать Spring Security с помощью JWT. По большей части я следовал руководству по безопасности и запустил приложение, но когда я пытаюсь вызвать... - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Несанкционированная ошибка: для доступа к этому ресурсу требуется полная аутентификация.
Anonymous » » в форуме JAVAКак устранить ошибку JWT в моем коде Spring?
ОШИБКА security.jwt.AuthEntryPointJwt — несанкционированная ошибка: для полной аутентификации требуется получить доступ к этому ресурсу
ОШИБКА security.jwt.AuthTokenFilter – невозможно установить... - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...