在搭建微服务时,本人使用的SpringSecurity Oauth2认证授权,使用密码方式,从认证中心获取了token后,要将token携带在请求头中,但是发现经过gateway网关后,token丢失了。
经过研究后,总结了一种方法,可以解决:通过使用过滤器,重新构建一个request,再向服务发送请求。
在网关服务增加一个bean,代码如下:
@Component
public class RequestAuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String url = request.getURI().getPath();
//忽略以下url
if(url.startsWith("/oauth") || url.startsWith("/login")){
return chain.filter(exchange);
}
String token = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
if(StringUtils.isBlank(token)){
ServerHttpResponse response = exchange.getResponse();
response.getHeaders().add(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_JSON_UTF8_VALUE);
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}else{
ServerHttpRequest req = request.mutate().headers(header -> header.add(HttpHeaders.AUTHORIZATION, token)).build();
ServerWebExchange webExchange = exchange.mutate().request(req).build();
return chain.filter(webExchange);
}
}
@Override
public int getOrder() {
return 100;
}
}