在zuul过滤器中修改请求标头

时间:2018-07-19 20:25:39

标签: httprequest netflix-zuul spring-cloud-netflix

我有一个后端服务,该服务接受Authorization标头来验证访问权限。我用Spring cloud zuul创建了一个网关服务,并将请求路由到后端服务。

网关服务本身受OAuth2保护,并接受授权标头来验证访问。现在,一旦请求授权给网关服务,网关服务便充当客户端,使用其clientid,secret和后端服务资源ID在标头中发送更新的Access令牌。由于必须发送Authorization标头,因此我试图在请求中更新Authorization标头,但是它采用以下两种方式。

ctx = RequestContext.getCurrentContext();
ctx.addZuulRequestHeader("Authorization", accessToken);

使用上述代码,它会添加Authorization标头,但会将其添加到后端服务无法识别的zuul标头中。

我已经创建了一个包装来修改请求对象,但是它不起作用

public class RequestWrapper extends HttpServletRequestWrapper
{
    private final Map<String, String[]> modifiableParameters;
    private Map<String, String[]> allParameters = null;

    public RequestWrapper(final HttpServletRequest request, 
                                                    final Map<String, String[]> additionalParams)
    {
        super(request);
        modifiableParameters = new TreeMap<String, String[]>();
        modifiableParameters.putAll(additionalParams);
    }

    @Override
    public String getParameter(final String name)
    {
        String[] strings = getParameterMap().get(name);
        if (strings != null)
        {
            return strings[0];
        }
        return super.getParameter(name);
    }

    @Override
    public Map<String, String[]> getParameterMap()
    {
        if (allParameters == null)
        {
            allParameters = new TreeMap<String, String[]>();
            allParameters.putAll(super.getParameterMap());
            allParameters.putAll(modifiableParameters);
        }

        return Collections.unmodifiableMap(allParameters);
    }

    @Override
    public Enumeration<String> getParameterNames()
    {
        return Collections.enumeration(getParameterMap().keySet());
    }

    @Override
    public String[] getParameterValues(final String name)
    {
        return getParameterMap().get(name);
    }
}

http://www.ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/中找到了上述包装器 并在zuul过滤器中调用

    authToken = getAuthToken();     
    String accessToken = "Bearer " + authToken;
    Map<String,String[]> additionalParams = new HashMap<>();

    additionalParams.put("Authorization", new String[] {accessToken});     
   ctx.setRequest(new RequestWrapper(request, additionalParams));

我在做什么错或者以其他任何方式修改请求标头?

1 个答案:

答案 0 :(得分:0)

如果您询问如何向Zuul请求中添加标头,则您的代码正确无误,但您应验证自己的过滤器类型(“前”,“路线”,“后...”)和 ORDER 过滤器。

检查此线程:Adding Headers to Zuul when re-directing

也许这也可以帮助您:How to select route based on header in Zuul

如果您需要通过Zuul将授权传递给后端服务,则可以检查sensitiveHeaders属性。像

zuul.routes.YOURSERVICE.sensitiveHeaders=Cookie,Set-Cookie