版本
jdk17
springboot3.1.1
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2022.0.4</spring-cloud.version>
<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
业务背景
当前用户登陆信息通过统一认证服务登陆后,在redis缓存token及用户信息。其他微服务无需鉴权token,但是又需要拿到当前登陆用户的一些信息。
实现
auth认证服务登陆认证通过后,缓存当前登陆用户信息,token为key,用户信息为value。退出登陆则删除key。前端请求通过头部携带token请求各个微服务,在各个微服务配置拦截器,拦截token取出用户信息,放入threadlocal,用完remove。
一、登陆服务存入
public SysManagerLoginResVO login(SysManagerLoginReqVO vo) {
SysManagerLoginResVO result = new SysManagerLoginResVO();
// 登陆逻辑。。。
// 缓存token及用户信息,其他服务使用
redisUtil.setUserByToken(PlatformTokenEnum.sys.getCode() + result.getToken(), JSON.toJSONString(manager));
return result;
}
二、其他微服务例如商品服务,配置拦截器
@Slf4j
@Component
@LiquibaseDataSource
public class UserLoginInterceptor implements HandlerInterceptor {
@Autowired
RedisUtil redisUtil;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");
log.info("获取前端透传的token:{}", token);
if (StrUtil.isNotBlank(token)) {
try {
// 通过用户的token获取auth服务存入的用户
String user = redisUtil.getString(PlatformTokenEnum.user.getCode() + token);
if (StrUtil.isNotBlank(user)) {
UserVO data = JSON.parseObject(user, UserVO.class);
SessionUtil.put(data);
}
} catch (Exception e) {
log.error("缓存用户信息,异常:{}", e.getMessage());
}
}
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
SessionUtil.removeUser();
}
}
三、注册拦截器
@Configuration
public class LoginConfig implements WebMvcConfigurer {
@Autowired
private UserLoginInterceptor userLoginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userLoginInterceptor).addPathPatterns("/u/**");
}
}