Zuul spring security 并在请求中添加附加参数

Posted

技术标签:

【中文标题】Zuul spring security 并在请求中添加附加参数【英文标题】:Zuul spring security and adding Additional Params in Request 【发布时间】:2016-11-08 21:18:52 【问题描述】:

我正在使用 Spring 微服务构建微服务,我有 2 个与此相关的问题。1.我在 Api 网关中具有弹簧安全性,即 Zuul 服务器,如果我已经从流中读取一次请求以进行身份​​验证(从 POST 请求获取用户名/传递),现在 Zuul 不会转发任何请求br>new ObjectMapper().readValue(request.getInputStream(), UserDto.class); 如何读取请求,然后再次将相同的请求转发到下游服务? 2、Zuul没有将request.setAttribute()转发到Downstream服务,所以解决方法是使用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";
  

【问题讨论】:

如果我没记错的话,你将不得不编写一个预过滤器来完成你正在寻找的东西尝试通过这个github.com/Netflix/zuul/wiki/Writing-Filters它可能会有所帮助。 @Grinish 即使我在过滤器中设置属性,我也无法将服务中的属性作为 request.getAttribute()。 我在我的代码中有同样的东西,我将属性添加到请求并在下游接收它正在工作,如果你已经有一个,你可以为你的过滤器添加代码吗... @Grinish 你在 Zuul 过滤器或其他任何地方添加真的很重要吗,我在我的一个 Spring Auth 过滤器中添加了 request.setAttribute(),但我也在 Zuul 过滤器中尝试了同样的方法。那么,如果你只是添加 request.setAttribute("test","test"),你是否能够进入下游,yml 中的任何特殊配置? @Grinish 我添加了 Spring 过滤器的代码。 【参考方案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注解它,所以它会自动加载。在run方法里面,使用addZuulRequestHeader

【讨论】:

如果您想添加授权或身份验证标头,这将不起作用。如果您需要添加这些标头,您需要将sensitiveHeaders: Cookie,Set-Cookie 添加到application.properties github.com/spring-cloud/spring-cloud-netflix/issues/…

以上是关于Zuul spring security 并在请求中添加附加参数的主要内容,如果未能解决你的问题,请参考以下文章

Spring starter security-basic auth-vai zuul 服务器

Spring Boot 如何在 Zuul 微服务上验证令牌

spring security oauth2认证中心 集成zuul网关的代码分析

Spring Security Cloud:通过 ZUUL 网关安全设置的 UI 服务

在 Spring Security 上具有不记名身份验证的 CORS

zuul+security跨域Cors问题解决