Zuul spring безопасность и добавление дополнительных параметров в запрос

Я создаю микросервисы с использованием Spring Microservices, у меня есть 2 вопроса, связанных с этим.

1. У меня есть пружинная безопасность на шлюзе Api, т.е. сервер Zuul, теперь Zuul не пересылает никаких запросов, если я уже прочитал запрос из потока один раз для аутентификации (чтобы получить имя пользователя/пароль из запроса POST) < br> new ObjectMapper().readValue(request.getInputStream(), UserDto.class);
Как я могу прочитать запрос, а затем снова переслать тот же запрос нижестоящим службам?

2. Zuul не пересылает request.setAttribute() к нижестоящим службам, поэтому обходным путем является использование ctx.addZuulRequestHeader, что делает Request Header слишком большим. Как я могу получить request.setAttribute и получить доступ к нижестоящим Сервисы.

 public Authentication getAuthentication(HttpServletRequest request) {
    final String token = request.getHeader(AUTH_HEADER_NAME);
    logger.info("token="+token);
    if (token != null) {
        logger.info("Entering getAuthentication");
        final UserToken userInfo = tokenHandler.validateToken(token);
        if (userInfo != null
                && token.equals(String.valueOf(redisUtility.getValue(userInfo.getUsername()+"_"+userInfo.getUniqueId())))) {
            logger.info("Validating token key="+userInfo.getUsername()+"_"+userInfo.getUniqueId());
            User user=userDetailsService.loadUserByUsername(userInfo.getUsername());
            if(user!=null && user.getUsername().equals(userInfo.getUsername())
                && user.getLastPasswordResetTime()<userInfo.getCreatedTime()){
                request.setAttribute("username",user.getUsername());//**Not able to fetch this in Downstream services**
                logger.info("Token Authenticated for User "+user.getUsername());
                return new UserAuthentication(user);
            }
        } 
    }
    return null;
}


  public class SimpleFilter extends ZuulFilter {

      private static Logger log = LoggerFactory.getLogger(SimpleFilter.class);

      @Override
      public String filterType() {
        return "pre";
      }

      @Override
      public int filterOrder() {
        return 1;
      }

      @Override
      public boolean shouldFilter() {
        return true;
      }

      @Override
      public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        request.setAttribute("test", "test");// Not able to get this in services
        log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));

        return null;
      }

 @Bean
  public SimpleFilter simpleFilter() {
    return new SimpleFilter();
  }

@RequestMapping(value = "/test/avl",method=RequestMethod.POST)
  public String test(HttpServletRequest request) {
    System.out.println(request.getAttribute("test")+"");
    return "Spring in Action";
  }

person Raghav Tandon    schedule 06.07.2016    source источник
comment
если я не ошибаюсь, вам придется написать предварительный фильтр, чтобы сделать то, что вы ищете, попробуйте пройти через этот github.com/Netflix/zuul/wiki/Writing-Filters это может помочь.   -  person Grinish Nepal    schedule 06.07.2016
comment
@Grinish, даже если я устанавливаю атрибуты в фильтре, я не могу получить их в службах как request.getAttribute().   -  person Raghav Tandon    schedule 06.07.2016
comment
у меня то же самое в моем коде, я добавляю атрибуты к запросу и получаю его ниже по течению, который работает, можете ли вы добавить код для своего фильтра, если он у вас уже есть...   -  person Grinish Nepal    schedule 06.07.2016
comment
@Grinish Действительно ли имеет значение, где вы добавляете в фильтр Zuul или где-либо еще, я добавляю request.setAttribute() в один из моих фильтров аутентификации Spring, но я пробовал то же самое и в фильтре Zuul. Итак, если вы просто добавите request.setAttribute(test,test), сможете ли вы получить какие-либо специальные конфигурации в yml?   -  person Raghav Tandon    schedule 06.07.2016
comment
@Grinish Я добавил код, который является фильтром Spring.   -  person Raghav Tandon    schedule 06.07.2016
comment
У меня есть атрибут, добавленный в предварительный фильтр zuul, и да, я смог получить тест в нижестоящих службах. Spring фильтр кажется мне alrite, попробуйте использовать фильтр zuul, так как вам нужно играть с запросом внутри zuul, а не с фильтром spring. Также при использовании фильтра Zuul не забудьте объявить @bean в классе с аннотацией enablezuulproxy. также никаких особых изменений в файле yml, единственное, что я не использую, Spring Security настолько отключен, что использование security.basic.enabled: false.   -  person Grinish Nepal    schedule 06.07.2016
comment
@Grinish Нет, это не работает. Я пробовал все возможности. Можете ли вы вставить свой код, где вы это делаете.   -  person Raghav Tandon    schedule 07.07.2016


Ответы (1)


Я знаю, что опоздал на 1 год. Но для любых новых посетителей.

создать фильтр.

@Component
public class AuthenticationFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();

        ctx.addZuulRequestHeader("userId", "123456789");
        return null;
    }
}

Аннотируйте его с помощью @Component, чтобы он загружался автоматически. Внутри метода запуска используйте addZuulRequestHeader

person fengd    schedule 14.03.2018