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
Мобильная версия