You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security+Zuul网关+Eureka环境下微服务调用401问题求助

问题排查与解决方案

1. 网关未传递认证头信息

Zuul默认会将Authorization列为敏感头,不会自动转发该头信息到微服务,导致微服务接收不到认证凭证,返回401。

  • 解决:在网关配置文件(application.yml/application.properties)中,将Authorization从敏感头中移除:
    zuul:
      sensitive-headers: Cookie,Set-Cookie # 仅保留Cookie相关头,排除Authorization使其可转发
      routes:
        people-ms:
          path: /people-ms/**
          serviceId: people-ms # 需与微服务的spring.application.name一致
    

2. 微服务Security配置拦截网关请求

微服务的Spring Security可能限制了请求来源,或开启了CSRF防护导致POST请求被拦截。

  • 解决:
    1. 在微服务的Security配置类中,允许网关IP访问(或测试环境临时放宽限制):
      @Configuration
      @EnableWebSecurity
      public class SecurityConfig extends WebSecurityConfigurerAdapter {
          @Override
          protected void configure(HttpSecurity http) throws Exception {
              http.authorizeRequests()
                  .antMatchers("/api/**").authenticated()
                  .and()
                  .httpBasic()
                  .and()
                  .csrf().disable(); // 测试环境可关闭CSRF,生产环境需配置令牌传递
              // 添加网关IP到白名单
              http.authorizeRequests().antMatchers("/api/**").hasIpAddress("127.0.0.1");
          }
      }
      
    2. 如果是POST请求,需确保网关转发了CSRF令牌,或临时关闭CSRF验证排查问题。

3. 路由路径与微服务上下文路径不匹配

若微服务配置了server.servlet.context-path,网关路由路径需对应调整,否则请求路径不符合微服务的Security路径规则。

  • 解决:假设微服务上下文路径为/api,网关路由需配置为:
    zuul:
      routes:
        people-ms:
          path: /people-ms/api/**
          serviceId: people-ms
          strip-prefix: true # 去掉前缀,转发到微服务的/api/**
    

4. 手动添加网关过滤器强制转发认证头

若默认配置仍无法转发Authorization头,可自定义Zuul过滤器强制传递:

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

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

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

    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String authHeader = request.getHeader("Authorization");
        if (authHeader != null) {
            ctx.addZuulRequestHeader("Authorization", authHeader);
        }
        return null;
    }
}

内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 23:22:32