@Service
public class LoginServiceImpl implements LoginService {
@Autowired
UserMapper userMapper;
@Autowired
JwtTokenManagerProperties jwtTokenManagerProperties;
@Autowired
ResourceMapper resourceMapper; //用于查询用户资源列表
@Autowired
SecurityProperties securityProperties; //用户获取白名单列表
@Autowired
RedisTemplate<String, String> redisTemplate; //用户存储redis数据
@Override
public UserVo login(LoginDto loginDto) {
//1. 根据用户名查询用户
UserVo userVo = userMapper.selectByName(loginDto.getUsername());
//2. 校验用户是否存在 如果不存在则提示用户登录失败
if (userVo == null) {
throw new BaseException(BasicEnum.LOGIN_FAIL);
}
//3. 校验是否被禁用 如果被禁用 , 则提示账号被禁用 请联系管理员
if (userVo.getDataState().equals(SuperConstant.DATA_STATE_1)) {
throw new BaseException(BasicEnum.LOGIN_DISABLE);
}
//4. 校验密码是否正确 ,使用BCrypt 如果 不 正确则提示用户或密码错误
if (!BCrypt.checkpw(loginDto.getPassword(), userVo.getPassword())) {
throw new BaseException(BasicEnum.LOGIN_ERROR_PASSWORD);
}
//5. 密码脱敏
userVo.setPassword(null);
//获取用户列表
List<String> urls = resourceMapper.selectRequestPathByUserId(userVo.getId());
//获取白名单列表 在配置类里面 properties 包
List<String> publicAccessUrls = securityProperties.getPublicAccessUrls();
//合并
urls.addAll(publicAccessUrls);
//6. 生成jwt令牌
Map<String, Object> claims = new HashMap<>();
claims.put("currentUser", JSONUtil.toJsonStr(userVo));
String jwt = JwtUtil.createJWT(jwtTokenManagerProperties.getBase64EncodedSecretKey(),
jwtTokenManagerProperties.getTtlback(),
claims);
//6.1 设置令牌
userVo.setUserToken(jwt);
//存储Redis 将用户所能访问的 , 所有的在资源列表
redisTemplate.opsForValue().set(CacheConstant.PUBLIC_ACCESS_URLS + userVo.getId(),
JSONUtil.toJsonStr(urls),
jwtTokenManagerProperties.getTtlback(),
TimeUnit.HOURS);
//7. 返回数据
return userVo;
}
}
后台登录流程
最新推荐文章于 2024-09-13 17:30:19 发布