Кроме того, я просто не могу связать два пользовательских фильтра друг с другом. Я хотел, чтобы фильтр JWTGenerator запускался перед моим JWTAuthenticationFilter, который будет запускаться до BasicAuthenticationFIlter, но если я укажу эти настройки в конфигурации, это выдаст исключение.
Я благодарен за любые совет, потому что у меня не осталось никаких идей, и я совершенно ничего не знаю.
SpringSecurityConfiguration:
Код: Выделить всё
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
private final SecurityUtil securityUtil;
public SecurityConfiguration(SecurityUtil securityUtil) {
this.securityUtil = securityUtil;
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.cors(corsCustomizer -> corsCustomizer.configurationSource(new CorsConfigurationSource() {
@Override
public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
CorsConfiguration config = new CorsConfiguration();
config.setAllowedOrigins(Collections.singletonList("http://localhost:4200"));
config.setAllowedMethods(Collections.singletonList("*"));
config.setAllowCredentials(true);
config.setAllowedHeaders(Collections.singletonList("*"));
config.setExposedHeaders(Arrays.asList("Authorization"));
config.setMaxAge(3600L);
return config;
}
})).csrf().disable()
.addFilterAfter(new JWTGeneratorFilter(securityUtil), BasicAuthenticationFilter.class)
.addFilterBefore(new JWTAuthenticationFilter(), BasicAuthenticationFilter.class)
.authorizeHttpRequests((requests) -> requests
.requestMatchers(HttpMethod.POST, "/login").permitAll()
.anyRequest().authenticated())
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
return http.build();
}
@Bean
public AuthenticationProvider authenticationProvider(){
CustomAuthenticationProvider authenticationProvider = new CustomAuthenticationProvider();
return authenticationProvider;
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
return config.getAuthenticationManager();
}
}
Код: Выделить всё
@RequiredArgsConstructor
@Component
public class JWTGeneratorFilter extends OncePerRequestFilter {
private final SecurityUtil securityUtil;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (null == authentication) {
ObjectMapper mapper = new ObjectMapper();
CredentialsDTO credentialsDTO = mapper.readValue(request.getInputStream(), CredentialsDTO.class);
User user = securityUtil.findByCredentialsDTO(credentialsDTO);
SecretKey key = Keys.hmacShaKeyFor(ConstantStore.JWT_SECRET.getBytes(StandardCharsets.UTF_8));
String jwt = Jwts.builder().setIssuer("FPE-Weblap").setSubject("JWT")
.claim("username", user.getUsername())
.claim("authorities", populateAuthorities(user.getRoles()))
.setIssuedAt(new Date())
.setExpiration(new Date((new Date()).getTime() + 30000000))
.signWith(key).compact();
response.setHeader(ConstantStore.TOKEN_HEADER, jwt);
request.setAttribute(ConstantStore.TOKEN_HEADER, jwt);
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword(), user.getRoles()));
}
filterChain.doFilter(request, response);
}
private String populateAuthorities(Collection
Подробнее здесь: [url]https://stackoverflow.com/questions/76428098/why-does-spring-security-respond-with-403-forbidden-to-all-my-requests[/url]