1. 概述
在做项目集成时,JPAAS 作为一个第三方的应用集成到其他的平台,主平台提供项目的验证和token。我们对 jpaas 做了相应的改造。
网关主要的作用有两个:
1.验证TOKEN是否有效。
2.将当前的用户信息发送到后端的微服务。
因为我们需要验证token ,这样就需要去主平台获取用户信息,然后将信息传递到后端,这样后端的微服务就直接从请求头获取用户信息,不需要在一次获取信息。
2. 实现方法
增加一个全局的过滤器。
这个过滤器作用如下:
1.验证需要带token的页面请求。
2.如果没有带token或者token不合法的token 我们进行拦截,直接返回到前端。
3.如果合法那我们将当前用户的对象信息传递到后端的服务。
相关代码如下:
public class HttpTokenRequestFilter implements GlobalFilter, Ordered {
@Autowired
private SecurityProperties securityProperties;
/**
* @param exchange
*/
@SneakyThrows
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest serverHttpRequest = exchange.getRequest();
String reqUrl = serverHttpRequest.getPath().value();
//reqUrl是否是httpTokenUrls校验url带token
boolean isContainUrl = securityProperties.getIgnore().containsIgnoreUrl(reqUrl);
if (!isContainUrl) {
String token= HttpUtil.getToken(serverHttpRequest);
//没有token的情况。
if (StringUtils.isEmpty(token)) {
return handNoToken(exchange,"notoken");
}
//根据token获取用户对象。
JPaasUser loginUser = UserUtil.getLoginUser(token);
if (BeanUtil.isEmpty(loginUser)) {
return handNoToken(exchange,"tokennvalid");
}
String jpaasUser=JSONObject.toJSONString(loginUser);
String enc= Base64.encode(jpaasUser);
//将用户对象数据加入到请求头中,给后端的服务使用。
serverHttpRequest.mutate().headers(h -> h.add("jpaas-user", enc)).build();
}
// 将请求发到后端。
ServerWebExchange build = exchange.mutate().request(serverHttpRequest).build();
return chain.filter(build);
}
private Mono<Void> handNoToken(ServerWebExchange exchange,String messge){
String baseUrl= SysPropertiesUtil.getString("space_loginUrl");
ServerHttpResponse response = exchange.getResponse();
String out="{\"code\":500,\"message\":\""+messge+"\",\"show\":false," +
"\"success\":false,\"data\":\""+baseUrl+"\"}";
byte[] bits = out.getBytes(StandardCharsets.UTF_8);
DataBuffer buffer = response.bufferFactory().wrap(bits);
//指定编码,否则在浏览器中会中文乱码
response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
return response.writeWith(Mono.just(buffer));
}
@Override
public int getOrder() {
return 100;
}
}
文档更新时间: 2021-03-29 11:54 作者:zyg