https 替换
This commit is contained in:
@@ -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();
|
||||
|
||||
// 构造TbSysUserDTO,status设为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 {
|
||||
|
||||
Reference in New Issue
Block a user