【发布时间】:2018-12-28 02:15:54
【问题描述】:
我有一个后端服务,它接受授权标头来验证访问。我使用 Spring cloud zuul 创建了一个网关服务,并将请求路由到后端服务。
网关服务本身受 OAuth2 保护,并接受授权标头来验证访问权限。现在,一旦请求授权给网关服务,网关服务就充当客户端,使用其客户端 ID、秘密和后端服务资源 ID 在标头中发送更新的访问令牌。由于它必须发送授权标头,我试图更新请求中的授权标头,但它采用以下两种方式。
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));
我做错了什么或以任何其他方式修改请求标头?
【问题讨论】:
标签: httprequest netflix-zuul spring-cloud-netflix