微服务登录解决方案
文章目录
- 微服务登录解决方案
-
- 1. 微服务用户登录校验流程
- 2. 微服务登录解决方案
-
- 2.1 客户端密码校验并生成token
- 2.2 网关登录校验
-
- 2.2.1 网关原理
- 2.2.2 编写网关过滤器
- 2.3 微服务获取用户信息
-
- 2.3.1 ThreadLocal工具
- 2.3.2 微服务拦截器
- 2.3.3 拦截器配置
- 2.4 OpenFeign传递用户
微服务登录解决方案
1. 微服务用户登录校验流程
微服务用户登录校验,大致流程如下图:
- 客户端用户登录,账户密码通过数据库校验以后,通过jwt生成token,每次向网关请求,都会在请求头中携带token;
- 网关会过滤请求,有登录需求的接口,网关会取出请求头中的token进行校验,通过后解析token拿到用户信息存请求头,传递给响应的微服务;
- 微服务通过请求头拿到用户信息,存到ThreadLocal,供后续业务使用;
- 微服务和微服务之间,也需要互相调用,其之间的调用,也是需要传递用户信息供业务使用;
2. 微服务登录解决方案
微服务登录解决方案:
2.1 客户端密码校验并生成token
客户端输入账号密码,查询数据库校验账户密码有效性:
@Override
public UserLoginVO login(LoginFormDTO loginDTO) {
// 1.数据校验
String username = loginDTO.getUsername();
//TODO:硬编码
// username = "jack";
String password = loginDTO.getPassword();
// password = "123";
// 2.根据用户名或手机号查询
User user = lambdaQuery().eq(User::getUsername, username).one();
Assert.notNull(user, "用户名错误");
// 3.校验是否禁用
if (user.getStatus() == UserStatus.FROZEN) {
throw new ForbiddenException("用户被冻结");
}
// 4.校验密码
if (!passwordEncoder.matches(password, user.getPassword())) {
throw new BadRequestException("用户名或密码错误");
}
// 5.生成TOKEN
String token = jwtTool.createToken(user.getId(), jwtProperties.getTokenTTL());
// 6.封装VO返回
UserLoginVO vo = new UserLoginVO();
vo.setUserId(user.getId());
vo.setUsername(user.getUsername());
vo.setBalance(user.getBalance());
vo.setToken(token