То, что я пытаюсь выполнить, - это аутентификация на основе токена jwt для моего отдыха api. Все под/api должно быть доступно только с помощью токена.Весенний фильтр аутентификации безопасности URL игнорируется
У меня есть следующий конфигурационный метод в моей конфигурации веб-безопасности:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authenticationProvider(authenticationProvider())
.csrf().disable()
.authorizeRequests().antMatchers("/api/**").authenticated()
.and()
.exceptionHandling()
.authenticationEntryPoint(authenticationEntryPoint())
.and()
.addFilterBefore(authenticationFilter(),BasicAuthenticationFilter.class)
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
И это фильтр:
public class JwtAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
public JwtAuthenticationFilter(AuthenticationManager manager) {
super("/api/**");
this.setAuthenticationManager(manager);
}
@Override
protected boolean requiresAuthentication(HttpServletRequest request, HttpServletResponse response) {
return true;
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
String header = request.getHeader("Authorization");
if (header == null || !header.startsWith("Bearer ")) {
throw new JwtTokenMissingException("No JWT token found in request headers");
}
String authToken = header.substring(7);
JwtAuthenticationToken authRequest = new JwtAuthenticationToken(authToken);
return getAuthenticationManager().authenticate(authRequest);
}
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult)
throws IOException, ServletException {
super.successfulAuthentication(request, response, chain, authResult);
chain.doFilter(request, response);
}
}
Моя проблема заключается в том, что фильтр теперь применяется к каждому URL, не только те с префиксом/api.
Я знаю, что мой метод «configure» может быть неправильным, но как он выглядит? Все, что я хочу сделать, это использовать фильтр для пути/api.
+1 вопрос: почему существуют два значения для настройки пути, к которому будет применяться фильтр? (один раз в качестве параметра для метода antMatchers в конфигурации, а затем аргумент конструктора «filterProcessesUrl» для AbstractAuthenticationProcessingFilter). Как эти значения соотносятся друг с другом, и какой из них я должен использовать?
Я думаю, что если вы добавите '.antMatcher ("/api/** ")' before' .addFilterBefore', ваша проблема также будет решена. – MNos