diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java b/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java index 1a01c70..aaae16c 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java @@ -1,10 +1,13 @@ package cn.bunny.common.service.context; +import cn.bunny.vo.system.login.LoginVo; + public class BaseContext { private static final ThreadLocal userId = new ThreadLocal<>(); private static final ThreadLocal username = new ThreadLocal(); private static final ThreadLocal adminId = new ThreadLocal<>(); private static final ThreadLocal adminName = new ThreadLocal<>(); + private static final ThreadLocal loginVo = new ThreadLocal<>(); // 用户id相关 public static Long getUserId() { @@ -23,9 +26,18 @@ public class BaseContext { username.set(_username); } + public static LoginVo getLoginVo() { + return loginVo.get(); + } + + public static void setLoginVo(LoginVo _loginVo) { + loginVo.set(_loginVo); + } + public static void removeUser() { username.remove(); userId.remove(); + loginVo.remove(); } // adminId 相关 diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/interceptor/UserTokenInterceptor.java b/common/service-utils/src/main/java/cn/bunny/common/service/interceptor/UserTokenInterceptor.java index 41e2092..1866a96 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/interceptor/UserTokenInterceptor.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/interceptor/UserTokenInterceptor.java @@ -2,6 +2,8 @@ package cn.bunny.common.service.interceptor; import cn.bunny.common.service.context.BaseContext; import cn.bunny.common.service.utils.JwtHelper; +import cn.bunny.common.service.utils.ResponseUtil; +import cn.bunny.pojo.result.Result; import cn.bunny.pojo.result.ResultCodeEnum; import cn.bunny.pojo.result.constant.RedisUserConstant; import cn.bunny.vo.system.login.LoginVo; @@ -18,51 +20,41 @@ import org.springframework.web.servlet.HandlerInterceptor; import java.util.Map; -import static cn.bunny.common.service.utils.ResponseHandlerUtil.loginAuthHandler; - @Component @Slf4j public class UserTokenInterceptor implements HandlerInterceptor { - @Autowired private RedisTemplate redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.info("UserTokenInterceptor===>设置拦截器"); - // 获取token String token = request.getHeader("token"); - - // token为空时 - if (token == null) { - return loginAuthHandler(response, ResultCodeEnum.LOGIN_AUTH); - } - - // 当token过期 - if (JwtHelper.isExpired(token)) { - return loginAuthHandler(response, ResultCodeEnum.AUTHENTICATION_EXPIRED); - } - - // 将token转成实体类 - Map tokenByMap = JwtHelper.getMapByToken(token); - LoginVo loginVo = JSONObject.parseObject(JSONObject.toJSONString(tokenByMap), LoginVo.class); - - // 获取用户id和用户邮箱 - Long userId = loginVo.getId(); - String email = loginVo.getEmail(); - String redisKey = RedisUserConstant.getUserLoginInfoPrefix(email); - Object redisUserinfo = redisTemplate.opsForValue().get(redisKey); + Map mapByToken = JwtHelper.getMapByToken(token); + LoginVo loginVo = JSONObject.parseObject(JSONObject.toJSONString(mapByToken), LoginVo.class); + Object redisUserinfo = redisTemplate.opsForValue().get(RedisUserConstant.getUserLoginInfoPrefix(loginVo.getEmail())); // 不是动态方法直接返回 if (!(handler instanceof HandlerMethod)) return true; - // 解析不到userId,Redis中没有这个用户 - if (userId == null || redisUserinfo == null) { - return loginAuthHandler(response, ResultCodeEnum.LOGIN_AUTH); + // token过期-提示身份验证过期 + if (JwtHelper.isExpired(token)) { + ResponseUtil.out(response, Result.error(ResultCodeEnum.AUTHENTICATION_EXPIRED)); + return false; + } + // 解析不到userId + if (loginVo.getId() == null) { + ResponseUtil.out(response, Result.error(ResultCodeEnum.LOGIN_AUTH)); + return false; + } + if (redisUserinfo == null) { + ResponseUtil.out(response, Result.error(ResultCodeEnum.LOGIN_AUTH)); + return false; } - BaseContext.setUserId(userId); - BaseContext.setUsername(email); + BaseContext.setUserId(loginVo.getId()); + BaseContext.setUsername(loginVo.getEmail()); + BaseContext.setLoginVo(loginVo); return true; } diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/utils/RequestUtil.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/RequestUtil.java new file mode 100644 index 0000000..b7942db --- /dev/null +++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/RequestUtil.java @@ -0,0 +1,57 @@ +package cn.bunny.common.service.utils; + +import cn.bunny.common.service.exception.BunnyException; +import cn.bunny.pojo.result.ResultCodeEnum; +import jakarta.servlet.http.HttpServletRequest; + +import java.net.Inet6Address; +import java.net.InetAddress; + +public class RequestUtil { + public static String getHttpIpAddress(HttpServletRequest request) { + + String ipv6Address = request.getRemoteAddr(); + try { + InetAddress inetAddress = InetAddress.getByName(ipv6Address); + if (inetAddress.isAnyLocalAddress() || inetAddress.isLoopbackAddress()) { + System.out.println("IPv4 Address: " + inetAddress.getHostAddress()); + } else { + InetAddress ipv4Address = Inet6Address.getByAddress(null, inetAddress.getAddress(), 0); + System.out.println("IPv4 Address: " + ipv4Address.getHostAddress()); + } + } catch (Exception e) { + throw new BunnyException(ResultCodeEnum.SERVICE_ERROR); + } + String ipAddress = request.getHeader("X-Forwarded-For"); + + if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("WL-Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("HTTP_X_FORWARDED"); + } + if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("HTTP_X_CLUSTER_CLIENT_IP"); + } + if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("HTTP_CLIENT_IP"); + } + if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("HTTP_FORWARDED_FOR"); + } + if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("HTTP_FORWARDED"); + } + if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("REMOTE_ADDR"); + } + + return ipAddress; + } +} diff --git a/dao/src/main/java/cn/bunny/entity/system/log/SystemLog.java b/dao/src/main/java/cn/bunny/entity/system/log/SystemLog.java index d1b587b..58d7308 100644 --- a/dao/src/main/java/cn/bunny/entity/system/log/SystemLog.java +++ b/dao/src/main/java/cn/bunny/entity/system/log/SystemLog.java @@ -41,7 +41,7 @@ public class SystemLog implements Serializable { private String methodName; @ApiModelProperty("入参内容") - private Object args; + private String args; @ApiModelProperty("返回参数") private String result; @@ -61,6 +61,9 @@ public class SystemLog implements Serializable { @ApiModelProperty("当前用户token") private String token; + @ApiModelProperty("当前用户IP地址") + private String ipAddress; + @ApiModelProperty("创建时间") private LocalDateTime createTime; @@ -72,4 +75,4 @@ public class SystemLog implements Serializable { @ApiModelProperty("是否被删除") private Boolean isDeleted; -} +} \ No newline at end of file diff --git a/service/src/main/java/cn/bunny/service/aop/aspect/AutoLogAspect.java b/service/src/main/java/cn/bunny/service/aop/aspect/AutoLogAspect.java index a6f07a4..5a8e4c5 100644 --- a/service/src/main/java/cn/bunny/service/aop/aspect/AutoLogAspect.java +++ b/service/src/main/java/cn/bunny/service/aop/aspect/AutoLogAspect.java @@ -54,24 +54,27 @@ public class AutoLogAspect { Map mapByToken = JwtHelper.getMapByToken(token); LoginVo loginVo = JSONObject.parseObject(JSONObject.toJSONString(mapByToken), LoginVo.class); + // 插入Ip地址 + systemLog.setIpAddress(request.getRemoteHost()); try { // 当为null时跳过执行 if (annotation != null) return joinPoint.proceed(); - - // TODO 将请求头token全部转成 map - systemLog.setClassPath(classPath); - systemLog.setMethodName(methodName); if (args.equals("[null]")) { systemLog.setArgs(null); } else { systemLog.setArgs(args); } - systemLog.setToken(token); + // 登录返回Vo不为空即插入 + if (loginVo != null) { + systemLog.setNickname(loginVo.getNickName()); + systemLog.setEmail(loginVo.getEmail()); + systemLog.setUpdateUser(loginVo.getId()); + } - systemLog.setNickname(loginVo.getNickName()); - systemLog.setEmail(loginVo.getEmail()); - systemLog.setUpdateUser(loginVo.getId()); + systemLog.setClassPath(classPath); + systemLog.setMethodName(methodName); + systemLog.setToken(token); // 目标对象(连接点)方法的执行 result = joinPoint.proceed();