Spring Security всегда выдает исключение InsufficientAuthenticationException, даже если SecuirtyContext аутентифицированJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring Security всегда выдает исключение InsufficientAuthenticationException, даже если SecuirtyContext аутентифицирован

Сообщение Anonymous »

поэтому я пытался создать jwt-фильтр, который «аутентифицирует» запрос.
JWTFilter.java:

Код: Выделить всё

`@RequiredArgsConstructor
@Slf4j
public class JWTFilter extends OncePerRequestFilter {

private final JWTService jwtService;
private final UserDetailsService userService;

private Optional getTokenFromHeader(HttpServletRequest request){
final String authHeader = request.getHeader("Authorization");
if(authHeader == null || !authHeader.startsWith("Bearer ")){
return Optional.empty();
}
return Optional.of(authHeader.substring(7));
}

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
log.error("Running filter...");

Optional rawToken = getTokenFromHeader(request);

if(rawToken.isEmpty()){
filterChain.doFilter(request, response);
return;
}

// TODO handle all the exception
try {
String token = rawToken.get();

// Validate
jwtService.validateToken(token);

/*
if(SecurityContextHolder.getContext().getAuthentication() != null){
filterChain.doFilter(request, response);
return;
}*/

String username = jwtService.getUserId(token);
log.info("\n\nUsername " + username);

UserDetails userDetails = userService.loadUserByUsername(username);

log.info("\n\nuserdetails " + userDetails.toString());

if(userDetails.getUsername() == null){
filterChain.doFilter(request, response);
return;
}

UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);

log.error("Doing last full auth is good " + SecurityContextHolder.getContext().getAuthentication().isAuthenticated());
filterChain.doFilter(request, response);

log.error("AFTER DO FILTER CHECK  " + SecurityContextHolder.getContext().getAuthentication().isAuthenticated());

} catch (JwtException e) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write("Invalid token " + e.getLocalizedMessage());
}
}

}
`
и даже несмотря на то, что журналы показывают, что для аутентификации контекста безопасности установлено значение true, он все равно не отправляет запрос на контроллер!!
это моя цепочка безопасности и вся конфигурация безопасности:

Код: Выделить всё

\`@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

private final AuthorizationEntryPoint unauthorizedHandler;
private final JWTService jwtService;
private final UserRepository userRepository;
private final UserDetailsService userService;

@Bean
public SecurityFilterChain provideSecurityFilterChain(HttpSecurity http) throws Exception {

http.csrf(AbstractHttpConfigurer::disable);
http.cors(AbstractHttpConfigurer::disable);

http.authorizeHttpRequests((requests) ->
requests
.requestMatchers("/auth/**").permitAll()
.requestMatchers("/swagger-ui/**").permitAll()
.requestMatchers("/v3/**").permitAll()
.anyRequest().authenticated()
)
.authenticationManager(provideAuthManager(http));

http.sessionManagement(sessionManagementConfigurer ->
sessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
);

http.authenticationProvider(provideAuthenticationProvider());
http.addFilterBefore(new JWTFilter(jwtService, userService), UsernamePasswordAuthenticationFilter.class);
http.exceptionHandling(exception ->  exception.authenticationEntryPoint(unauthorizedHandler));

return http.build();
}

@Bean
public PasswordEncoder provideEncoder(){
return new BCryptPasswordEncoder();
}

@Bean
public AuthenticationProvider provideAuthenticationProvider(){
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userService);
authProvider.setPasswordEncoder(provideEncoder());
return authProvider;
}

@Bean
public AuthenticationManager provideAuthManager(HttpSecurity httpSecurity) throws Exception {
AuthenticationManagerBuilder authenticationManagerBuilder = httpSecurity.getSharedObject(AuthenticationManagerBuilder.class);
authenticationManagerBuilder.userDetailsService(userService).passwordEncoder(provideEncoder());
return authenticationManagerBuilder.build();
}

}
`
это контроллер, а конечная точка — это конечная точка «post», которую я пытаюсь достичь:

Код: Выделить всё

\`@RestController()
@RequestMapping("/blog_posts")
@Slf4j
public class PostController {

private final PostsService postsService;

public PostController(PostsService postsService){
this.postsService = postsService;
}

@GetMapping("/info")
public String getPosts(){
return "Blog posts";
}

@GetMapping("/")
public List getBlogPosts(@RequestParam() Long limit, @RequestParam Long offset){
return postsService.getBlogPosts(limit, offset);
}

@PostMapping("/")
public BlogPost addBlogPost(@RequestParam AddBlogPostRequest request){
log.error("Doing controller");

Authentication authentication  = SecurityContextHolder.getContext().getAuthentication();
User user = (User) authentication.getDetails();

BlogPost post = new BlogPost();
post.setTitle(request.getTitle());
post.setBody(request.getBody());
post.setUserId(user.getId());

return postsService.addBlogPost(post);
}

}
`
это компонент и конфигурация для службы сведений о пользователях:

Код: Выделить всё

\`@Configuration
@RequiredArgsConstructor
public class AppConfig {

private final UserRepository userRepository;

@Bean
public UserDetailsService provideUserDetailsService() throws Exception {
return new UserDetailsService() {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return userRepository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
}
};
}

}
`
пожалуйста, помогите мне, я бьюсь с этим уже три дня, я прочитал все форумы, замученные чатgpt, и не могу найти решение. Я также попросил своих друзей просмотреть несколько видеоуроков, и я просто не знаю, что делать.

Подробнее здесь: https://stackoverflow.com/questions/790 ... n-when-the
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»