单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,不再共享数据。也就意味着每个微服务都需要做登录校验,这显然不可取。
1. 思路分析
既然网关是所有微服务的入口,一切请求都需要先经过网关。我们完全可以把登录校验的工作放到网关去做。
不过,这里存在几个问题:
(1)网关路由是配置的,请求转发是Gateway内部代码,我们如何在转发之前做登录校验?
可以使用网关过滤器。
(2)网关校验JWT之后,如何将用户信息传递给微服务?
由于网关发送请求到微服务依然采用的是Http
请求,因此我们可以将用户信息以请求头的方式传递到下游微服务。然后微服务可以从请求头中获取登录用户信息。
(3)微服务之间也会相互调用,这种调用不经过网关,又该如何传递用户信息?
在微服务发起调用时把用户信息存入请求头。
2. 登录校验过滤器
白名单的配置:
在 application.yml
或 application.properties
文件中配置不需要拦截的路径白名单。
gateway:
ignoreUrls:
- /auth/login
- /auth/register
- /public/**
在这个示例中,/auth/login
、<