fix(auth):密码登录账号/密码错误无提示,登录配置读取与全局异常兜底
1.SysPasswordService.validate登录重试配置(login/maxRetryCount,lockTime)读取增加try/catch与空值保护,三方服务异常或配置缺失时降级默认值(错5次锁30分钟)并warn日志,不再NPE/NumberFormatException导致msg为空 2.GlobalExceptionHandler的RuntimeException/Exception分支对e.getMessage()为空兜底为'系统繁忙,请稍后重试',保证App端始终能拿到可展示的错误信息
This commit is contained in:
@@ -28,6 +28,7 @@ import com.mhd.common.redis.service.RedisService;
|
|||||||
import com.mhd.common.security.utils.password.PasswordUtil;
|
import com.mhd.common.security.utils.password.PasswordUtil;
|
||||||
import com.mhd.system.api.RemoteLogService;
|
import com.mhd.system.api.RemoteLogService;
|
||||||
import com.mhd.system.api.domain.SysLogininforPo;
|
import com.mhd.system.api.domain.SysLogininforPo;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -39,6 +40,7 @@ import javax.annotation.Resource;
|
|||||||
* @description: 登录密码方法
|
* @description: 登录密码方法
|
||||||
* @date 2023/12/26 15:33
|
* @date 2023/12/26 15:33
|
||||||
**/
|
**/
|
||||||
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
public class SysPasswordService
|
public class SysPasswordService
|
||||||
{
|
{
|
||||||
@@ -76,29 +78,31 @@ public class SysPasswordService
|
|||||||
if (retryCount == null) {
|
if (retryCount == null) {
|
||||||
retryCount = 0;
|
retryCount = 0;
|
||||||
}
|
}
|
||||||
//TODO 从三方配置表中取值
|
//TODO 从三方配置表中取值(失败时用默认值,保证登录错误提示可用)
|
||||||
SysDepartInterfaceInfoDTO sysDepartInterfaceInfoDTO = new SysDepartInterfaceInfoDTO();
|
int maxRetryCount = 5; // 默认:密码错5次锁定
|
||||||
sysDepartInterfaceInfoDTO.setTopOrganizationId(userPo.getTopOrganizationId());
|
long lockTime = 30L; // 默认:锁定30分钟
|
||||||
sysDepartInterfaceInfoDTO.setInterfaceType("login");
|
try {
|
||||||
sysDepartInterfaceInfoDTO.setInterfaceTypeKey("maxRetryCount");
|
SysDepartInterfaceInfoDTO dto = new SysDepartInterfaceInfoDTO();
|
||||||
List<SysDepartInterfaceInfoPo> sysDepartInterfaceInfoPos = thirdPartyServiceFeign.queryListByFeign(sysDepartInterfaceInfoDTO);
|
dto.setTopOrganizationId(userPo.getTopOrganizationId());
|
||||||
if (sysDepartInterfaceInfoPos.isEmpty()){
|
dto.setInterfaceType("login");
|
||||||
String errMsg = "缺少登录信息配置,请联系管理员";
|
dto.setInterfaceTypeKey("maxRetryCount");
|
||||||
recordLogininfor(userPo, Constants.LOGIN_FAIL, errMsg, 1);
|
List<SysDepartInterfaceInfoPo> pos = thirdPartyServiceFeign.queryListByFeign(dto);
|
||||||
throw new ServiceException(errMsg);
|
if (pos != null && !pos.isEmpty()) {
|
||||||
|
maxRetryCount = Integer.parseInt(pos.get(0).getInterfaceTypeValue());
|
||||||
|
} else {
|
||||||
|
log.warn("组织[{}]缺少登录配置 login/maxRetryCount,使用默认值{}", userPo.getTopOrganizationId(), maxRetryCount);
|
||||||
|
}
|
||||||
|
dto.setInterfaceTypeKey("lockTime");
|
||||||
|
pos = thirdPartyServiceFeign.queryListByFeign(dto);
|
||||||
|
if (pos != null && !pos.isEmpty()) {
|
||||||
|
lockTime = Long.parseLong(pos.get(0).getInterfaceTypeValue());
|
||||||
|
} else {
|
||||||
|
log.warn("组织[{}]缺少登录配置 login/lockTime,使用默认值{}", userPo.getTopOrganizationId(), lockTime);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("读取登录配置失败,使用默认重试策略", e);
|
||||||
}
|
}
|
||||||
SysDepartInterfaceInfoPo sysDepartInterfaceInfoPo = sysDepartInterfaceInfoPos.get(0);
|
if (retryCount >= maxRetryCount) {
|
||||||
Integer maxRetryCount = Integer.valueOf(sysDepartInterfaceInfoPo.getInterfaceTypeValue());
|
|
||||||
sysDepartInterfaceInfoDTO.setInterfaceTypeKey("lockTime");
|
|
||||||
sysDepartInterfaceInfoPos = thirdPartyServiceFeign.queryListByFeign(sysDepartInterfaceInfoDTO);
|
|
||||||
if (sysDepartInterfaceInfoPos.isEmpty()){
|
|
||||||
String errMsg = "缺少登录信息配置,请联系管理员";
|
|
||||||
recordLogininfor(userPo, Constants.LOGIN_FAIL, errMsg, 1);
|
|
||||||
throw new ServiceException(errMsg);
|
|
||||||
}
|
|
||||||
sysDepartInterfaceInfoPo = sysDepartInterfaceInfoPos.get(0);
|
|
||||||
Long lockTime = Long.valueOf(sysDepartInterfaceInfoPo.getInterfaceTypeValue());
|
|
||||||
if (retryCount >= maxRetryCount){
|
|
||||||
String errMsg = String.format("密码输入错误%s次,帐户锁定%s分钟", maxRetryCount, lockTime);
|
String errMsg = String.format("密码输入错误%s次,帐户锁定%s分钟", maxRetryCount, lockTime);
|
||||||
recordLogininfor(userPo, Constants.LOGIN_FAIL, errMsg, 1);
|
recordLogininfor(userPo, Constants.LOGIN_FAIL, errMsg, 1);
|
||||||
throw new ServiceException(errMsg);
|
throw new ServiceException(errMsg);
|
||||||
|
|||||||
+4
-2
@@ -88,7 +88,8 @@ public class GlobalExceptionHandler
|
|||||||
{
|
{
|
||||||
String requestURI = request.getRequestURI();
|
String requestURI = request.getRequestURI();
|
||||||
log.error("请求地址'{}',发生未知异常.", requestURI, e);
|
log.error("请求地址'{}',发生未知异常.", requestURI, e);
|
||||||
return AjaxResult.error(e.getMessage());
|
String msg = StringUtils.isEmpty(e.getMessage()) ? "系统繁忙,请稍后重试" : e.getMessage();
|
||||||
|
return AjaxResult.error(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -99,7 +100,8 @@ public class GlobalExceptionHandler
|
|||||||
{
|
{
|
||||||
String requestURI = request.getRequestURI();
|
String requestURI = request.getRequestURI();
|
||||||
log.error("请求地址'{}',发生系统异常.", requestURI, e);
|
log.error("请求地址'{}',发生系统异常.", requestURI, e);
|
||||||
return AjaxResult.error(e.getMessage());
|
String msg = StringUtils.isEmpty(e.getMessage()) ? "系统繁忙,请稍后重试" : e.getMessage();
|
||||||
|
return AjaxResult.error(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user