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