2016-07-03 2 views
2

То, что я пытаюсь выполнить, - это аутентификация на основе токена 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). Как эти значения соотносятся друг с другом, и какой из них я должен использовать?

ответ

1

Проблема эта часть:

@Override 
protected boolean requiresAuthentication(HttpServletRequest request, HttpServletResponse response) { 
    return true; 
} 

Я скопировал его и не понял, что это было.

+0

Я думаю, что если вы добавите '.antMatcher ("/api/** ")' before' .addFilterBefore', ваша проблема также будет решена. – MNos

Смежные вопросы