小程序修正

This commit is contained in:
2025-12-23 13:27:36 +08:00
parent cfb160cf09
commit ce66812c82
48 changed files with 766 additions and 735 deletions

View File

@@ -52,7 +52,9 @@ public class AuthController {
*/
@PostMapping("/login")
public ResultDomain<LoginDomain> login(@RequestBody LoginParam loginParam, HttpServletRequest request) {
return authService.login(loginParam, request);
// 从 request 中提取客户端 IP 并设置到 loginParam
loginParam.setClientIp(getClientIP(request));
return authService.login(loginParam);
}
/**
@@ -64,7 +66,8 @@ public class AuthController {
*/
@PostMapping("/logout")
public ResultDomain<LoginDomain> logout(HttpServletRequest request) {
return authService.logout(request);
String token = extractTokenFromRequest(request);
return authService.logout(token);
}
/**
@@ -88,7 +91,9 @@ public class AuthController {
*/
@PostMapping("/refresh")
public ResultDomain<LoginDomain> refreshToken(HttpServletRequest request) {
return authService.refreshToken(request);
String token = extractTokenFromRequest(request);
String clientIp = getClientIP(request);
return authService.refreshToken(token, clientIp);
}
/**
@@ -321,7 +326,8 @@ public class AuthController {
loginParam.setEmail(email);
}
ResultDomain<LoginDomain> loginResult = authService.login(loginParam, request);
loginParam.setClientIp(getClientIP(request));
ResultDomain<LoginDomain> loginResult = authService.login(loginParam);
if (loginResult.getSuccess()) {
return ResultDomain.success("注册成功", loginResult.getData());
@@ -335,4 +341,35 @@ public class AuthController {
return ResultDomain.failure("注册失败: " + e.getMessage());
}
}
/**
* 从请求中提取Token
*/
private String extractTokenFromRequest(HttpServletRequest request) {
String authHeader = request.getHeader("Authorization");
if (authHeader != null && authHeader.startsWith("Bearer ")) {
return authHeader.substring(7);
}
return null;
}
/**
* 获取客户端IP地址
*/
private String getClientIP(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
if (ip != null && ip.contains(",")) {
ip = ip.split(",")[0].trim();
}
return ip;
}
}

View File

@@ -8,9 +8,9 @@ import org.xyzh.api.system.service.ModulePermissionService;
import org.xyzh.api.system.vo.SysUserVO;
import org.xyzh.api.system.vo.PermissionVO;
import org.xyzh.api.system.vo.UserDeptRoleVO;
import org.xyzh.auth.enums.UserStatus;
import org.xyzh.auth.strategy.LoginStrategyFactory;
import org.xyzh.auth.strategy.LoginStrategy;
import org.xyzh.auth.enums.UserStatus;
import org.xyzh.auth.utils.CapcatUtils;
import org.xyzh.common.auth.utils.JwtTokenUtil;
import org.xyzh.common.core.domain.LoginDomain;
@@ -30,7 +30,6 @@ import org.apache.dubbo.config.annotation.DubboService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.servlet.http.HttpServletRequest;
import java.util.concurrent.TimeUnit;
import java.util.List;
import java.util.ArrayList;
@@ -208,7 +207,7 @@ public class AuthServiceImpl implements AuthService{
}
@Override
public ResultDomain<LoginDomain> login(LoginParam loginParam, HttpServletRequest request) {
public ResultDomain<LoginDomain> login(LoginParam loginParam) {
String loginType = loginParam.getLoginType();
String loginAttempt = IdUtil.generateID(); // 生成登录尝试ID
@@ -262,7 +261,7 @@ public class AuthServiceImpl implements AuthService{
SysUserVO userInfo = userInfoResult.getData();
// 7. 构建完整的登录域对象
LoginDomain loginDomain = buildLoginDomain(userInfo, loginType, request);
LoginDomain loginDomain = buildLoginDomain(userInfo, loginType, loginParam.getClientIp());
if (loginDomain == null) {
logLoginAttempt(loginParam, user, false, loginAttempt, "构建登录信息失败");
return ResultDomain.failure("构建登录信息失败");
@@ -297,10 +296,10 @@ public class AuthServiceImpl implements AuthService{
* 构建完整的LoginDomain对象
* @param userInfo 用户信息
* @param loginType 登录类型
* @param request HTTP请求
* @param clientIp 客户端IP地址
* @return LoginDomain 登录域对象
*/
public LoginDomain buildLoginDomain(SysUserVO userInfo, String loginType, HttpServletRequest request) {
public LoginDomain buildLoginDomain(SysUserVO userInfo, String loginType, String clientIp) {
try {
// 1. 转换为 DTO 对象
TbSysUserDTO userDTO = SysUserVO.toDTO(userInfo);
@@ -369,7 +368,7 @@ public class AuthServiceImpl implements AuthService{
loginDomain.setUserPermissions(userPermissions);
loginDomain.setUserViews(userViews);
loginDomain.setLoginType(loginType);
loginDomain.setIpAddress(getClientIP(request));
loginDomain.setIpAddress(clientIp);
return loginDomain;
@@ -408,10 +407,9 @@ public class AuthServiceImpl implements AuthService{
}
@Override
public ResultDomain<LoginDomain> refreshToken(HttpServletRequest request) {
public ResultDomain<LoginDomain> refreshToken(String token, String clientIp) {
try {
String token = extractTokenFromRequest(request);
if (token == null) {
if (token == null || token.trim().isEmpty()) {
return ResultDomain.failure("Token不能为空");
}
@@ -438,7 +436,7 @@ public class AuthServiceImpl implements AuthService{
SysUserVO userInfo = userInfoResult.getData();
// 4. 重新构建LoginDomain
LoginDomain newLoginDomain = buildLoginDomain(userInfo, oldLoginDomain.getLoginType(), request);
LoginDomain newLoginDomain = buildLoginDomain(userInfo, oldLoginDomain.getLoginType(), clientIp);
if (newLoginDomain == null) {
return ResultDomain.failure("构建登录信息失败");
}
@@ -472,10 +470,9 @@ public class AuthServiceImpl implements AuthService{
}
@Override
public ResultDomain<LoginDomain> logout(HttpServletRequest request) {
public ResultDomain<LoginDomain> logout(String token) {
try {
String token = extractTokenFromRequest(request);
if (token == null) {
if (token == null || token.trim().isEmpty()) {
return ResultDomain.failure("Token不能为空");
}
@@ -508,37 +505,5 @@ public class AuthServiceImpl implements AuthService{
return ResultDomain.failure("登出失败: " + e.getMessage());
}
}
/**
* 从请求中提取Token
*/
private String extractTokenFromRequest(HttpServletRequest request) {
String authHeader = request.getHeader("Authorization");
if (authHeader != null && authHeader.startsWith("Bearer ")) {
return authHeader.substring(7);
}
return null;
}
/**
* 获取客户端IP地址
*/
private String getClientIP(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// 如果是多个IP取第一个
if (ip != null && ip.contains(",")) {
ip = ip.split(",")[0].trim();
}
return ip;
}
}

View File

@@ -93,4 +93,5 @@ logging:
charset:
console: UTF-8
file: UTF-8
level:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE

View File

@@ -9,40 +9,14 @@
</Properties>
<appenders>
<!-- 控制台输出 -->
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!-- INFO级别日志 -->
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log"
filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingFile>
<!-- WARN级别日志 -->
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log"
filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingFile>
<!-- ERROR级别日志 -->
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log"
filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<RollingFile name="RollingFile" fileName="${FILE_PATH}/${FILE_NAME}.log"
filePattern="${FILE_PATH}/${FILE_NAME}-%d{yyyy-MM-dd}_%i.log.gz">
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
@@ -53,42 +27,39 @@
</appenders>
<loggers>
<!-- Nacos 日志 -->
<logger name="com.alibaba.nacos" level="info" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</logger>
<!-- MyBatis 日志 -->
<logger name="org.mybatis" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</logger>
<!-- Spring 日志 -->
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Logger>
<Logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="TRACE" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Logger>
<!-- Auth 模块日志 -->
<Logger name="org.xyzh.auth" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFileInfo"/>
<AppenderRef ref="RollingFileWarn"/>
<AppenderRef ref="RollingFileError"/>
<AppenderRef ref="RollingFile"/>
</Logger>
<!-- 项目通用模块日志 -->
<Logger name="org.xyzh.common" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFileInfo"/>
<AppenderRef ref="RollingFileWarn"/>
<AppenderRef ref="RollingFileError"/>
<AppenderRef ref="RollingFile"/>
</Logger>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
<appender-ref ref="RollingFile"/>
</root>
</loggers>
</configuration>