package com.sandu.common.security.token; import cn.hutool.core.util.IdUtil; import com.sandu.common.redis.RedisService; import com.sandu.common.redis.UserModel; import com.sandu.common.security.LoginUserInfo; import lombok.AllArgsConstructor; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; /** * @author chenjiantian * @date 2022/1/8 16:39 */ @AllArgsConstructor @Component @ConditionalOnProperty(prefix = "sandu.jwt", name = "cache-online", havingValue = "true") public class RedisTokenProvider implements TokenProvider { private final RedisService redisService; @Override public String createToken(LoginUserInfo loginUserInfo) { if (loginUserInfo.getUserId() == null) { throw new IllegalArgumentException("用户id不能为空"); } String token = IdUtil.simpleUUID(); loginUserInfo.setToken(token); loginUserInfo.setCreateTimestamp(System.currentTimeMillis()); redisService.set(UserModel.USER_TOKEN.key(token), loginUserInfo, UserModel.USER_TOKEN.expireSeconds()); redisService.set(UserModel.USER_INFO.key(loginUserInfo.getUserId().toString() + loginUserInfo.getAdministratorType()), loginUserInfo); return token; } @Override public LoginUserInfo validateToken(String token) { if (token == null) { return null; } LoginUserInfo loginUserInfo = (LoginUserInfo) redisService.get(UserModel.USER_TOKEN.key(token)); if (loginUserInfo == null) { return null; } LoginUserInfo userInfo = (LoginUserInfo) redisService.get(UserModel.USER_INFO.key(loginUserInfo.getUserId().toString() + loginUserInfo.getAdministratorType().toString())); if (userInfo != null) { if (redisService.getExpire(token) < UserModel.USER_TOKEN.expireSeconds()) { redisService.expire(token, UserModel.USER_TOKEN.expireSeconds()); } } return userInfo; } }