Токен, добавленный в заголовок, невозможно прочитать в методе doFilterInternal при реализации безопасности REST API SpringBoot с использованием токенов JWT - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь реализовать REST с токенами JWT, но не могу заставить его работать ... В примерах я вижу, что есть реализации JWTAuthentication и JWTAutherization,

JWTAuthenticationFilter

  @Override
  protected void successfulAuthentication(HttpServletRequest req, HttpServletResponse res,
      FilterChain chain, Authentication auth) throws IOException, ServletException {

    String token = Jwts.builder().setSubject(((User) auth.getPrincipal()).getUsername())
        .claim("roles", ((User) auth.getPrincipal()).getAuthorities())
        .setExpiration(new Date(System.currentTimeMillis() + SecurityConstants.EXPIRATION_TIME))
        .signWith(SignatureAlgorithm.HS512, SecurityConstants.SECRET.getBytes()).compact();
    res.addHeader(SecurityConstants.HEADER_STRING, SecurityConstants.TOKEN_PREFIX + token);
    chain.doFilter(req, res);
  }

JWTAuthorizationFilter

  @Override
  protected void doFilterInternal(
      HttpServletRequest req, HttpServletResponse res, FilterChain chain)
      throws IOException, ServletException {

    String header = req.getHeader(SecurityConstants.HEADER_STRING);

    if (header == null || !header.startsWith(SecurityConstants.TOKEN_PREFIX)) {
      if (header == null) {
        System.out.println("header null");
      } else if (!header.startsWith(SecurityConstants.TOKEN_PREFIX)) {
        System.out.println("token prefix missing in header");
        System.out.println(header);
      }
      chain.doFilter(req, res);
      return;
    }

    UsernamePasswordAuthenticationToken authentication = getAuthentication(req);

    SecurityContextHolder.getContext().setAuthentication(authentication);
    chain.doFilter(req, res);
  }

Когда я проверяю код, сначала вызывается successAuthentication , а затем вызывается doFilterInternal .
В successAuthentication мы устанавливаем заголовок в объекте ответа и после этого пытаемся прочитать заголовок из объекта запроса в методе doFilterInternal . Один из объектов предназначен для запросов, а другой - для ответов, так почему мы пишем одному и читаем другому?
Я спрашиваю об этом, потому что в своих тестах я вижу, что добавляю токен в заголовок, но когда я чтение из объекта запроса в методе doFilterInternal Я получаю значение NULL, я вижу журнал "Префикс токена отсутствует в заголовке" ...

Что не так с моим пониманием?

Спасибо

...