跳至主要內容

Zuul 的鉴权以及微服务的跨域问题

logycoconut关于技术SpringBoot大约 2 分钟

  • SpringCloud采用了Zuul作为微服务的网口
  • Zuul网关为全部微服务提供唯一入口, 避免直接暴露接口, 后台服务更加安全
  • 对每个请求鉴权
  • 处理跨域请求

跨域请求处理

关于跨域问题,现在一般都采用 CORS 方案(一个 W3C 标准)解决, 需要服务器和浏览器同时支持,但是开发者只需要关心服务器实现即可,其他的都由浏览器完成

浏览器会在请求中加上一些头信息,例如 Origin,我们需要以此判断是否允许其跨域,然后在响应头中加入一些信息

SpringMVC 内部实现了 CORS 的跨域过滤器 CorsFilter ,我们可以直接用,编写代码将其注入到容器中即可

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        // 1.添加Cors配置信息
        CorsConfiguration config = new CorsConfiguration();
        // 1.1 允许的域
        config.addAllowedOrigin("http://example.com");
        // 1.2 是否发送Cookie信息
        config.setAllowCredentials(true);
        // 1.3 允许的请求方式
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("HEAD");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("DELETE");
        config.addAllowedMethod("PATCH");
        // 1.4允许的头信息
        config.addAllowedHeader("*");

        // 2.添加映射路径,这里拦截一切请求
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);

        // 3.返回新的CorsFilter
        return new CorsFilter(configSource);
    }

}

请求鉴权

继承 ZuulFilter

原理就是对于每个经过网关的请求都进行过滤

编写 Component 继承 ZuulFilter 并实现接口方法

@Component
public class ExampleFilter extends ZuulFilter {

    /**
     * 过滤类别,:
     * pre:在请求被路由之前调用
     * routing: 路由请求时被调用
     * post: 在routing和error过滤器之后被调用
     * error: 处理请求时发生错误后被调用
     */
    @Override
    public String filterType() {
        return null;
    }

    /**
     * 过滤优先级
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 判断是否进行过滤
     */
    @Override
    public boolean shouldFilter() {
        return false;
    }

    /**
     * 处理主要逻辑的地方, 例如进行登录判断, 日志记录等
     */
    @Override
    public Object run() throws ZuulException {
        return null;
    }
}

Zuul 不允许设置敏感 Head 头的坑

在鉴权服务中, 我们通常使用 jwt 来实现客户端的无状态登录, 所以需要向客户端中设置 cookie 信息

但是 zuul 内部有默认的过滤器, 会将请求和响应头信息过滤, 不允许设置敏感信息 ( 比如set-cookie )

解决方案:

在application.yml中配置

zuul:
  sensitive-headers:  # 配置禁止使用的头信息, 设置为null代表不禁止任何头信息