Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zuul spring安全性和在请求中添加附加参数_Spring_Spring Cloud_Microservices_Netflix Zuul_Spring Cloud Netflix - Fatal编程技术网

Zuul spring安全性和在请求中添加附加参数

Zuul spring安全性和在请求中添加附加参数,spring,spring-cloud,microservices,netflix-zuul,spring-cloud-netflix,Spring,Spring Cloud,Microservices,Netflix Zuul,Spring Cloud Netflix,我正在使用Spring微服务构建微服务,我有两个与此相关的问题。1。我在Api网关中有spring security,即Zuul服务器,现在如果我已经从流中读取了一次请求以进行身份验证(从POST请求中获取用户名/通行证),Zuul不会转发任何请求 newObjectMapper().readValue(request.getInputStream(),UserDto.class) 如何读取请求,然后再次将相同的请求转发给下游服务? 2.Zuul没有将请求.setAttribute()转发到下游

我正在使用Spring微服务构建微服务,我有两个与此相关的问题。

1。我在Api网关中有spring security,即Zuul服务器,现在如果我已经从流中读取了一次请求以进行身份验证(从POST请求中获取用户名/通行证),Zuul不会转发任何请求
newObjectMapper().readValue(request.getInputStream(),UserDto.class)

如何读取请求,然后再次将相同的请求转发给下游服务?

2.Zuul没有将请求.setAttribute()转发到下游服务,因此解决方法是使用ctx.addZuulRequestHeader,这使得
请求头
太大,如何实现请求.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";
  }
公共身份验证getAuthentication(HttpServletRequest请求){ 最终字符串标记=request.getHeader(AUTH\u HEADER\u NAME); logger.info(“令牌=”+令牌); if(令牌!=null){ logger.info(“输入getAuthentication”); final UserToken userInfo=tokenHandler.validateToken(令牌); 如果(userInfo!=null &&token.equals(String.valueOf(redisUtility.getValue(userInfo.getUsername()+“\u”+userInfo.getUniqueId())){ logger.info(“正在验证令牌密钥=“+userInfo.getUsername()+”quot+userInfo.getUniqueId()); User User=userDetailsService.loadUserByUsername(userInfo.getUsername()); 如果(user!=null&&user.getUsername().equals(userInfo.getUsername())
&&user.getLastPasswordResetTime()我知道已经晚了一年。但是对于任何新访客

创建一个过滤器

@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注释它,这样它就会自动加载。在run方法中,使用
addZuulRequestHeader

如果我没有错的话,你必须编写一个预过滤器来完成你正在寻找的东西,试着完成它可能会有所帮助。@Grinish即使我在过滤器中设置了属性,我也无法按请求获取服务中的属性。getAttribute()。我的代码中也有相同的东西我向请求添加属性并在下游接收它,这是可行的。如果您已经有了过滤器,您可以为过滤器添加代码吗…@Grinish在哪里添加Zuul过滤器或其他任何地方,真的很重要吗,我正在添加请求。setAttribute()在我的一个Spring Auth筛选器中,但我也在Zuul筛选器中尝试了相同的方法。因此,如果您只添加request.setAttribute(“test”、“test”),您是否能够进入下游,在yml中是否有任何特殊配置?@Grinish我添加了Spring筛选器代码。