From 09fc9c1df4919562bd3a375bc0b30a37222f63b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B2=85?= <907037276@qq.com> Date: Wed, 21 Jun 2023 01:17:35 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=97=A5=E5=BF=97=E5=88=87=E9=9D=A2?= =?UTF-8?q?=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annotation/aspect/OperateLogAspect.java | 82 +++++++++++++++++++ .../config/LogRecordEvent.java | 14 ++++ .../config/security/TokenProvider.java | 36 +++++++- 3 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/sztzjy/forex/trading_trading/annotation/aspect/OperateLogAspect.java create mode 100644 src/main/java/com/sztzjy/forex/trading_trading/config/LogRecordEvent.java diff --git a/src/main/java/com/sztzjy/forex/trading_trading/annotation/aspect/OperateLogAspect.java b/src/main/java/com/sztzjy/forex/trading_trading/annotation/aspect/OperateLogAspect.java new file mode 100644 index 0000000..e33b3c0 --- /dev/null +++ b/src/main/java/com/sztzjy/forex/trading_trading/annotation/aspect/OperateLogAspect.java @@ -0,0 +1,82 @@ +package com.sztzjy.forex.trading_trading.annotation.aspect; + +import cn.hutool.core.util.URLUtil; +import cn.hutool.extra.servlet.ServletUtil; +import cn.hutool.http.HttpUtil; +import com.sztzjy.forex.trading_trading.annotation.OperateLog; +import com.sztzjy.forex.trading_trading.config.LogRecordEvent; +import com.sztzjy.forex.trading_trading.config.SpringContextHolder; +import com.sztzjy.forex.trading_trading.config.security.JwtUser; +import com.sztzjy.forex.trading_trading.config.security.TokenProvider; +import com.sztzjy.forex.trading_trading.entity.Log; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.Ordered; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; + +/** + * 系统日志切面实现 + * + */ +@Aspect +@Slf4j +@Component +public class OperateLogAspect implements Ordered { + @Autowired + private HttpServletRequest request; + + @Around("@annotation(operateLog)") + @SneakyThrows + public Object around(ProceedingJoinPoint point, OperateLog operateLog) { + String strClassName = point.getTarget().getClass().getName(); + String strMethodName = point.getSignature().getName(); + log.debug("[类名]:{},[方法]:{}", strClassName, strMethodName); + Log logRecord = geLog(operateLog.recordParameters(), operateLog.description()); + // 发送异步日志事件 + Object obj = point.proceed(); + SpringContextHolder.publishEvent(new LogRecordEvent(logRecord)); + return obj; + } + + /** + * 解析日志 + * + * @param recordParameters 记录参数 + * @param description 描述 + * @return log + */ + private Log geLog(boolean recordParameters, String description) { + Log logRecord = new Log(); + JwtUser curUser = null; + try { + curUser = TokenProvider.getJWTUser(request); + } catch (Exception e) { + logRecord.setOperatorName("匿名"); + } + + if (curUser != null) { + logRecord.setOperatorId(curUser.getUserId()); + logRecord.setOperatorName(curUser.getName()); + } + + logRecord.setIpAddress(ServletUtil.getClientIP(request)); + logRecord.setAction(URLUtil.getPath(request.getRequestURI())); + logRecord.setUserAgent(request.getHeader("user-agent")); + logRecord.setDescription(description); + if (recordParameters) { + logRecord.setParams(HttpUtil.toParams(request.getParameterMap())); + } + return logRecord; + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE + 1; + } +} diff --git a/src/main/java/com/sztzjy/forex/trading_trading/config/LogRecordEvent.java b/src/main/java/com/sztzjy/forex/trading_trading/config/LogRecordEvent.java new file mode 100644 index 0000000..ad41d1b --- /dev/null +++ b/src/main/java/com/sztzjy/forex/trading_trading/config/LogRecordEvent.java @@ -0,0 +1,14 @@ +package com.sztzjy.forex.trading_trading.config; + +import org.springframework.context.ApplicationEvent; + +/** + * 系统日志事件捕获 + * + */ +public class LogRecordEvent extends ApplicationEvent { + private static final long serialVersionUID = -7520983571492156143L; + public LogRecordEvent(Object source) { + super(source); + } +} diff --git a/src/main/java/com/sztzjy/forex/trading_trading/config/security/TokenProvider.java b/src/main/java/com/sztzjy/forex/trading_trading/config/security/TokenProvider.java index 2538577..0d82de9 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/config/security/TokenProvider.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/config/security/TokenProvider.java @@ -1,6 +1,17 @@ package com.sztzjy.forex.trading_trading.config.security; +import com.google.common.collect.Lists; +import com.sztzjy.forex.trading_trading.config.Constant; +import com.sztzjy.forex.trading_trading.config.exception.UnAuthorizedException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; @Component public class TokenProvider { @@ -12,9 +23,32 @@ public class TokenProvider { * @return jwt解析对象 */ - public JwtUser getClaims(String jwtToken) { + public static JwtUser getClaims(String jwtToken) { //todo 解析用户token return null; } + + + public static JwtUser getJWTUser(HttpServletRequest request) { + if (!(request.getUserPrincipal() instanceof UsernamePasswordAuthenticationToken)) { + throw new UnAuthorizedException("身份认证失败"); + } + String jwtToken = request.getHeader(Constant.AUTHORIZATION); + if (StringUtils.hasText(jwtToken)) { + return getJWTUser(jwtToken); + } + throw new UnAuthorizedException("身份认证失败"); + } + + public static JwtUser getJWTUser(String tokenValue) { + try { + JwtUser principal = getClaims(tokenValue); + return principal; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + }