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/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/dao/src/main/java/cn/bunny/pojo/result/constant/FileMessageConstant.java b/dao/src/main/java/cn/bunny/pojo/result/constant/FileMessageConstant.java index d608a30..fc027bd 100644 --- a/dao/src/main/java/cn/bunny/pojo/result/constant/FileMessageConstant.java +++ b/dao/src/main/java/cn/bunny/pojo/result/constant/FileMessageConstant.java @@ -6,7 +6,7 @@ import lombok.Data; public class FileMessageConstant { public static final String DOWNLOAD_BUCKET_EXCEPTION = "下载文件失败"; public static final String FILE_UPLOAD_EXCEPTION = "文件上传失败"; - public static final String BUCKET_EXISTS_EXCEPTION = "查询文化部对象失败"; + public static final String BUCKET_EXISTS_EXCEPTION = "查询文件对象失败"; public static final String DELETE_BUCKET_EXCEPTION = "删除文件对象失败"; public static final String FILE_IS_EMPTY = "文件信息为空"; public static final String FILE_IS_NOT_EXITS = "文件信息为空"; diff --git a/module/module-minio/src/main/java/cn/bunny/module/minio/utils/MinioUtil.java b/module/module-minio/src/main/java/cn/bunny/module/minio/utils/MinioUtil.java index cec93ea..5f717fd 100644 --- a/module/module-minio/src/main/java/cn/bunny/module/minio/utils/MinioUtil.java +++ b/module/module-minio/src/main/java/cn/bunny/module/minio/utils/MinioUtil.java @@ -1,6 +1,7 @@ package cn.bunny.module.minio.utils; import cn.bunny.common.service.exception.BunnyException; +import cn.bunny.module.minio.properties.MinioProperties; import cn.bunny.pojo.result.constant.FileMessageConstant; import io.minio.*; import io.minio.messages.*; @@ -19,9 +20,43 @@ import java.util.Map; @Component @Slf4j public class MinioUtil { + @Autowired + private MinioProperties properties; @Autowired private MinioClient minioClient; + /** + * 获取Minio全路径名 + * + * @param objectName 对象名称 + * @return 全路径 + */ + public String getFullPath(String objectName) { + String url = properties.getEndpointUrl(); + String bucketName = properties.getBucketName(); + + return url + "/" + bucketName + objectName; + } + + /** + * 获取文件并返回字节数组 + * + * @param bucketName 桶名称 + * @param objectName 对象名称 + * @return 文件流对象 + */ + public byte[] getBucketObjectByte(String bucketName, String objectName) { + try { + GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); + log.info("获取文件 ------ 成功"); + return getObjectResponse.readAllBytes(); + } catch (Exception exception) { + log.error("获取文件 ------ 失败消息:{}", exception.getLocalizedMessage()); + exception.getStackTrace(); + } + throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); + } + /** * 判断桶是否存在 * diff --git a/service/src/main/java/cn/bunny/service/aop/aspect/AutoFillAspect.java b/service/src/main/java/cn/bunny/service/aop/aspect/AutoFillAspect.java index 423102c..20d6cd9 100644 --- a/service/src/main/java/cn/bunny/service/aop/aspect/AutoFillAspect.java +++ b/service/src/main/java/cn/bunny/service/aop/aspect/AutoFillAspect.java @@ -5,6 +5,7 @@ import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Component; @Aspect 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(); diff --git a/service/src/main/resources/application-dev.yml b/service/src/main/resources/application-dev.yml index 511b357..0eae702 100644 --- a/service/src/main/resources/application-dev.yml +++ b/service/src/main/resources/application-dev.yml @@ -1,19 +1,19 @@ bunny: datasource: - host: 106.15.251.123 + host: 192.168.1.4 port: 3305 - sqlData: guigu-oa + sqlData: bunny_docs username: root password: "02120212" redis: - host: 47.120.65.66 + host: 192.168.1.4 port: 6379 database: 3 - password: "02120212" + password: "123456" minio: - endpointUrl: "http://129.211.31.58:9000" - bucket-name: ssyx + endpointUrl: "http://192.168.1.4:9000" + bucket-name: test accessKey: bunny secretKey: "02120212" \ No newline at end of file diff --git a/service/src/test/java/cn/bunny/jwt/JwtHelperTest.java b/service/src/test/java/cn/bunny/jwt/JwtHelperTest.java index edaf1f1..b6166ef 100644 --- a/service/src/test/java/cn/bunny/jwt/JwtHelperTest.java +++ b/service/src/test/java/cn/bunny/jwt/JwtHelperTest.java @@ -98,8 +98,10 @@ class JwtHelperTest { createTokenWithMapToken = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_23MTQ7CIBBA4buM2_IzQCuw8gTeYQqTFC3aVDQmTe9uD-D6e3kbLLRShbjtHTxKul-pMkR4v3i98JfqMrNMzwod0IcarYdNrS1RKTRBGkRpUfY-Oq21Oqk0UTvakiGisR1wpTL__91aOWDMIRtGFnq0Xrg0oBh7rwUOIZPzaPV5gP0HuCPau6cAAAA.5CGFhEz1i9RLKfFMYHA7cOg3sdfFEDZnqbBHSP9R_XY"; createTokenWithMapToken = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_23MTQ6CMBBA4buMW_oz7VChK0_gHcZSQpUiwWpMCHe3B3D9vbwdVt44g9-PBpYUHlfOETy8X3G7xC_ndY4yPDM0wB8uvFWbSlm9Umh6aRClRdl2nrTW6qTCxKW2aQCPxjYQM6f5_-9eUgXqWzThRmKk8SzIaBSMzgnXsuuI-sFqguMH0SvcYacAAAA.qW_gqkc8RQJM-UbFVj7xldSEv1RORO4qlw6VMrTEmM0"; createTokenWithMapToken = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_23MSw7CIBRA0b08p_yhFBi5AvfwApiiRQmiMWm6d7sAx-fmbtCwY4Ww7QQeJd4vWDMEeL9yP-cv1rZmFp8VCOAHB_bDljFa4Fwqz5SUTEs2uWCEEPzE44LjaEuCIJUmkCuW9f_vNsoBaJ1yYnZ0Rqep8VlRnESi3khrklFeXC3sP3hOgQ2nAAAA.bkPBbfpLd21eaJE2gjzniUx5n9VvCqWSY_zBiu8oO9k"; + createTokenWithMapToken = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_23MWw7CIBBA0b2Mv7yGhxa-XIF7GCmkaNEG0Zg03btdgN_n5q6wUKMKYd0YPEq8X6gmCPB-pXZOX6rLnER8VmBAH-rUdpt6X4KUqL3QiMKgcEOwSil5kHGivrdlhIDaMEiVyvz_d-tlhxg1WoXI6aiu3GLWfLCD5z6PJ2eMR5cdbD-TzBm3pwAAAA.Zq6T6wsZ9aoRxck4LDAl7QwGDUu_eMiRsGgNt5fSM-4"; + - Map tokenByMap = JwtHelper.getTokenByMap(createTokenWithMapToken); + Map tokenByMap = JwtHelper.getMapByToken(createTokenWithMapToken); // 转为Java实体对戏那个 User user = JSONObject.parseObject(JSONObject.toJSONString(tokenByMap), User.class); @@ -114,7 +116,7 @@ class JwtHelperTest { createTokenWithMapToken = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_23MTQ7CIBBA4buMW36nQAsrT-AdpoApWrSpaEya3t0ewPX38jZYaKUKYdsZPEq8X6hmCPB-5fWcv1SXOYv4rMCAPtRoPWxqbQlSavQCtRadFnYIRiklTzJO1I62JAgaOwa5Upn__26tHIBjTOSvxB2agRurDCeTHMceE1nne6dH2H-VOEqApwAAAA.j5BcFLT-2HENeYS8LvD27tyRnI1rE-iFzjBy1iY02T4"; createTokenWithMapToken = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_23MTQ7CIBBA4buM2_JXWkpZeQLvMNIhRYsSRGPS9O5yANffy9shY8EEbj86eER_v2AicPB-UTnTF1PeiPtngg7wgxVLs7XW7IRQ_cx7pbhWfLRukFKKk_Ar1tbGBZzqdQeUMG7_f7caG1zlZCZDyGavFzZ4MzC0ZmIWQ1DWeBtGguMHw7854qcAAAA.V4VLIJ7vUqnfd1LeQkXa3t8V_376DWVAA_g0PE_6_S8"; - Map tokenByMap = JwtHelper.getTokenByMap(createTokenWithMapToken, key); + Map tokenByMap = JwtHelper.getMapByToken(createTokenWithMapToken, key); // 转为Java实体对戏那个 User user = JSONObject.parseObject(JSONObject.toJSONString(tokenByMap), User.class); System.out.println(user);