Spring JWTAuthenticationFilter возвращает 403, но все равно выполняет запрос - PullRequest
0 голосов
/ 26 ноября 2018

Я играл с Spring Security и пытался заставить JWTAuthorizationFilter работать для моих запросов, но хотя фильтр возвращает 403, запрещенных для запросов, если пользователь не вошел в систему, как ожидалось, запросвсе еще выполняется, когда этого не должно быть.

Например, если у меня есть метод для создания нового проекта, проект создается, и сервер возвращает 403, но ожидаемое поведение - 403, а проекта нет.создал.

Я использовал https://github.com/devdojobr/springboot-essentials/blob/master/src/main/java/br/com/devdojo/config/JWTAuthenticationFilter.java в качестве ссылки, но мне все еще не повезло.

По-моему, это проблема цепочки фильтров, но я не совсем уверен, как это может быть проблемой

Я прикрепил свой класс Filter и SecurityConfig ниже:

Будет полезна любая помощь или указатели.

JWTAuthorizationFilter.java

package uk.ac.qub.eeecs.csc3045.year1819.cs1.server.security;

import io.jsonwebtoken.Jwts;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
import org.springframework.stereotype.Component;
import uk.ac.qub.eeecs.csc3045.year1819.cs1.server.service.SpringUserDetailService;

@Component
public class JWTAuthorizationFilter extends BasicAuthenticationFilter {

  @Value("${security.jwt.token.secret-key:secret-key}")
  private String secretKey = "secret-key";

  @Value("${security.jwt.token.expire-length:3600000}")
  private long validityInMilliseconds = 3600000;

  private final SpringUserDetailService springUserDetailService;

  public JWTAuthorizationFilter(
      AuthenticationManager authenticationManager, SpringUserDetailService springUserDetailService) {
    super(authenticationManager);
    this.springUserDetailService = springUserDetailService;
  }

  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
      FilterChain chain) throws IOException, ServletException {
    super.doFilterInternal(request, response, chain);

    String header = request.getHeader("Authorization");

    if (header == null || !header.startsWith("Bearer "))  {
      chain.doFilter(request, response);
      return;
    }

    UsernamePasswordAuthenticationToken authenticationToken = getAuthenticationToken(request);

    SecurityContextHolder.getContext().setAuthentication(authenticationToken);
    chain.doFilter(request,response);
  }

  private UsernamePasswordAuthenticationToken getAuthenticationToken(HttpServletRequest request)  {
    String token = request.getHeader("Authorization");
    if (token != null)  {
      //parse token
      String user = Jwts.parser()
          .setSigningKey(secretKey)
          .parseClaimsJws(token.replace("Bearer ", ""))
          .getBody()
          .getSubject();
      UserDetails userDetails = springUserDetailService.loadUserByUsername(user);

      if (user != null) {
        return new UsernamePasswordAuthenticationToken(user, null, userDetails.getAuthorities());
      }
        return null;
    }
    return null;
  }
}

SecurityConfig.java

package uk.ac.qub.eeecs.csc3045.year1819.cs1.server.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import uk.ac.qub.eeecs.csc3045.year1819.cs1.server.security.JWTAuthorizationFilter;
import uk.ac.qub.eeecs.csc3045.year1819.cs1.server.service.SpringUserDetailService;

/**
 * Configuration settings for management of JWT.
 *
 * JWT Implementation adapted from @see <a href="https://jwt.io/</a>
 */
@Configuration
@EnableConfigurationProperties
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

  @Autowired
  private SpringUserDetailService springUserDetailService;

  @Override
  @Bean
  public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
  }

  /**
   * Configure settings for JWT.
   *
   * @param http Spring security builder.
   * @throws Exception
   */
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.cors().and().csrf().disable().authorizeRequests()
        .antMatchers("/v2/users/login").permitAll()
        .anyRequest().authenticated()
        .and()
        .addFilter(new JWTAuthorizationFilter(authenticationManager(), springUserDetailService));
  }
}

1 Ответ

0 голосов
/ 27 ноября 2018

Не следует продолжать выполнение цепочки фильтров, если вы не нашли UserDetails.Попробуйте бросить AuthenticationException и начать его через AuthenticationEntryPoint.

. Вы можете проверить точное поведение на Spring Security JWT: JwtAuthorizationFilter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...