背景:
微服务结构下,在网关和授权服务分别接入sa-token,网关的作用是拦截请求验证token,授权服务的作用是进行登录相关操作。
问题:
在授权服务中完成登录后,后续请求携带token来到网关处进行验证,在网关处使用StpUtil.getTokenValue()方法能正常获取token值进行验证,但是无法使用StpUtil.getLoginId()获取对应的登录id,会报无法获取有效的上下文错误,并且后续想要在网关进行权限验证,就必须获得当前请求会话中登录的id去数据库查询对应的角色权限。
解决方法:
微服务是分布式的实现,网关和授权服务分别是两个独立的服务,查看官方文档,我们应该实现分布式session的同步,引入官方的redis依赖,并且两个服务都需要引入,自此sa-token框架会帮我们在redis中同步session,不需要你做更多的操作,这里注意的是网关gateway采用的webflux框架,不同于授权服务的springboot框架,引入的sa-token依赖是不同的,官网也指出了这一点。
授权服务:
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.34.0</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dao-redis-jackson</artifactId>
<version>1.34.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
网关服务:
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-reactor-spring-boot-starter</artifactId>
<version>1.34.0</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dao-redis-jackson</artifactId>
<version>1.34.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>