https 替换

This commit is contained in:
2025-12-27 17:34:19 +08:00
parent 55801fa0ec
commit 0fb7a4ffb2
18 changed files with 233 additions and 293 deletions

View File

@@ -5,9 +5,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.xyzh.api.auth.service.AuthService;
import org.xyzh.api.system.service.SysUserService;
import org.xyzh.api.system.service.ModulePermissionService;
import org.xyzh.api.system.service.GuestService;
import org.xyzh.api.system.vo.SysUserVO;
import org.xyzh.api.system.vo.PermissionVO;
import org.xyzh.api.system.vo.UserDeptRoleVO;
import org.xyzh.common.dto.sys.TbGuestDTO;
import org.xyzh.auth.enums.UserStatus;
import org.xyzh.auth.strategy.LoginStrategyFactory;
import org.xyzh.auth.strategy.LoginStrategy;
@@ -64,6 +66,9 @@ public class AuthServiceImpl implements AuthService{
@DubboReference(version = "1.0.0", group = "system", timeout = 5000, check = false, retries = 0)
private ModulePermissionService modulePermissionService;
@DubboReference(version = "1.0.0", group = "system", timeout = 5000, check = false, retries = 0)
private GuestService guestService;
@Autowired
private LoginStrategyFactory loginStrategyFactory;
@@ -412,63 +417,164 @@ public class AuthServiceImpl implements AuthService{
if (token == null || token.trim().isEmpty()) {
return ResultDomain.failure("Token不能为空");
}
// 1. 验证当前Token是否有效
if (jwtTokenUtil.isTokenExpired(token)) {
return ResultDomain.failure("Token已过期");
}
// 2. 从Redis获取登录信息
// 2. 从JWT中提取用户ID和登录类型
String userId = jwtTokenUtil.getUserIdFromToken(token);
String loginType = jwtTokenUtil.getClaimFromToken(token, claims -> claims.get("loginType", String.class));
if (userId == null || userId.trim().isEmpty()) {
return ResultDomain.failure("Token信息不完整");
}
logger.info("Token刷新请求userId={}, loginType={}", userId, loginType);
// 3. 尝试从Redis获取登录信息优先使用缓存
String loginKey = "login:token:" + token;
String loginJson = redisService.get(loginKey, String.class);
if (loginJson == null) {
return ResultDomain.failure("登录信息已失效");
LoginDomain oldLoginDomain = null;
if (loginJson != null) {
oldLoginDomain = JSON.parseObject(loginJson, LoginDomain.class);
if (loginType == null && oldLoginDomain != null) {
loginType = oldLoginDomain.getLoginType();
}
}
LoginDomain oldLoginDomain = JSON.parseObject(loginJson, LoginDomain.class);
// 3. 获取用户最新信息
ResultDomain<SysUserVO> userInfoResult = userService.getUserInfo(oldLoginDomain.getUser().getUserId());
if (!userInfoResult.getSuccess() || userInfoResult.getData() == null) {
return ResultDomain.failure("获取用户信息失败");
// 4. 根据登录类型获取最新用户信息
LoginDomain newLoginDomain;
if ("wechat_miniprogram".equals(loginType)) {
// 来客小程序用户从guest表获取信息
TbGuestDTO guestDTO = new TbGuestDTO();
guestDTO.setUserId(userId);
ResultDomain<TbGuestDTO> guestResult = guestService.selectGuestOne(guestDTO);
if (!guestResult.getSuccess() || guestResult.getData() == null) {
return ResultDomain.failure("获取来客信息失败");
}
TbGuestDTO guest = guestResult.getData();
newLoginDomain = buildGuestLoginDomain(guest, loginType);
} else {
// 普通用户从sys_user表获取信息
ResultDomain<SysUserVO> userInfoResult = userService.getUserInfo(userId);
if (!userInfoResult.getSuccess() || userInfoResult.getData() == null) {
return ResultDomain.failure("获取用户信息失败");
}
SysUserVO userInfo = userInfoResult.getData();
String effectiveLoginType = (loginType != null) ? loginType : "password";
newLoginDomain = buildLoginDomain(userInfo, effectiveLoginType, clientIp);
}
SysUserVO userInfo = userInfoResult.getData();
// 4. 重新构建LoginDomain
LoginDomain newLoginDomain = buildLoginDomain(userInfo, oldLoginDomain.getLoginType(), clientIp);
if (newLoginDomain == null) {
return ResultDomain.failure("构建登录信息失败");
}
// 5. 生成新Token
String newToken = jwtTokenUtil.generateToken(newLoginDomain);
newLoginDomain.setToken(newToken);
// 6. 删除旧的Token信息
redisService.delete(loginKey);
// 6. 删除旧的Token信息(如果存在)
if (loginJson != null) {
redisService.delete(loginKey);
}
// 7. 存储新的登录信息
String newLoginKey = "login:token:" + newToken;
redisService.set(newLoginKey, JSON.toJSONString(newLoginDomain), 24, TimeUnit.HOURS);
// 8. 更新用户登录状态
String userLoginKey = "login:user:" + userInfo.getUserId();
String userLoginKey = "login:user:" + userId;
redisService.set(userLoginKey, newToken, 24, TimeUnit.HOURS);
logger.info("Token刷新成功userId={}, oldToken={}, newToken={}",
userInfo.getUserId(),
logger.info("Token刷新成功userId={}, loginType={}, oldToken={}, newToken={}",
userId,
loginType,
token.substring(0, Math.min(10, token.length())) + "...",
newToken.substring(0, Math.min(10, newToken.length())) + "...");
return ResultDomain.success("Token刷新成功", newLoginDomain);
} catch (Exception e) {
logger.error("Token刷新失败", e);
return ResultDomain.failure("Token刷新失败: " + e.getMessage());
}
}
/**
* 从来客信息构造LoginDomain用于token刷新
*/
private LoginDomain buildGuestLoginDomain(TbGuestDTO guest, String loginType) {
try {
LoginDomain loginDomain = new LoginDomain();
// 构造TbSysUserDTOstatus设为guest
TbSysUserDTO userDTO = new TbSysUserDTO();
userDTO.setUserId(guest.getUserId());
userDTO.setPhone(guest.getPhone());
userDTO.setEmail(guest.getEmail());
userDTO.setWechatId(guest.getWechatId());
userDTO.setStatus("guest"); // 来客特殊状态
loginDomain.setUser(userDTO);
// 构造TbSysUserInfoDTO
TbSysUserInfoDTO userInfoDTO = new TbSysUserInfoDTO();
userInfoDTO.setUserId(guest.getUserId());
userInfoDTO.setUsername(guest.getName() != null ? guest.getName() : "来客");
loginDomain.setUserInfo(userInfoDTO);
// 设置角色信息
List<TbSysUserRoleDTO> userRoles = new ArrayList<>();
TbSysUserRoleDTO userRole = new TbSysUserRoleDTO();
userRole.setUserId(guest.getUserId());
userRole.setRoleId("role_guest");
userRole.setDeptId("dept_root");
userRoles.add(userRole);
loginDomain.setUserRoles(userRoles);
// 获取用户权限信息
List<TbSysPermissionDTO> userPermissions = new ArrayList<>();
List<TbSysViewDTO> userViews = new ArrayList<>();
ResultDomain<PermissionVO> permissionsResult = modulePermissionService.getUserPermissions(guest.getUserId());
if (permissionsResult.getSuccess() && permissionsResult.getDataList() != null) {
for (PermissionVO permission : permissionsResult.getDataList()) {
if (permission.getPermissionId() != null) {
TbSysPermissionDTO permissionDTO = PermissionVO.toPermissionDTO(permission);
if (permissionDTO != null) {
userPermissions.add(permissionDTO);
}
}
if (permission.getViewId() != null) {
TbSysViewDTO viewDTO = PermissionVO.toViewDTO(permission);
if (viewDTO != null) {
userViews.add(viewDTO);
}
}
}
}
loginDomain.setUserPermissions(userPermissions);
loginDomain.setUserViews(userViews);
// 设置登录类型
loginDomain.setLoginType(loginType != null ? loginType : "wechat_miniprogram");
logger.info("构建来客LoginDomain成功userId={}, name={}", guest.getUserId(), guest.getName());
return loginDomain;
} catch (Exception e) {
logger.error("构建来客LoginDomain失败userId={}", guest.getUserId(), e);
return null;
}
}
@Override
public ResultDomain<LoginDomain> logout(String token) {
try {