Procházet zdrojové kódy

安全日志管理

bmmx před 1 rokem
rodič
revize
f6de2b8f16

+ 44 - 0
src/main/java/com/om/controller/admin/SecurityLogController.java

@@ -0,0 +1,44 @@
+package com.om.controller.admin;
+
+
+import com.om.entity.dto.SecurityLogQueryPageDTO;
+import com.om.entity.po.SecurityLog;
+import com.om.entity.vo.SecurityLogQueryPageVO;
+import com.om.service.ISecurityLogService;
+import com.om.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author bmmx
+ * @since 2024-04-27
+ */
+@RestController
+@Api(tags = "安全日志管理")
+@RequestMapping("web/security-log")
+public class SecurityLogController {
+
+    @Resource
+    private ISecurityLogService securityLogService;
+
+    @ApiOperation("分页查询安全日志")
+    @PostMapping("getPageList")
+    public Result<SecurityLogQueryPageVO> getPageList(@RequestBody SecurityLogQueryPageDTO dto) {
+        return securityLogService.getPageList(dto);
+    }
+
+    @GetMapping("delete")
+    @ApiOperation("根据id删除安全日志")
+    private Result delete(@RequestParam("id") Integer id) {
+        return Result.ok(securityLogService.removeById(id));
+    }
+
+
+}

+ 40 - 0
src/main/java/com/om/controller/user/APPSecurityLogController.java

@@ -0,0 +1,40 @@
+package com.om.controller.user;
+
+
+import com.om.entity.dto.AppBaseDTO;
+import com.om.entity.dto.AppSecurityLogDTO;
+import com.om.service.ISecurityLogService;
+import com.om.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author bmmx
+ * @since 2024-04-27
+ */
+@RestController
+@Api(tags = "安全日志")
+@RequestMapping("app/security-log")
+public class APPSecurityLogController {
+
+    @Resource
+    private ISecurityLogService securityLogService;
+
+    @ApiOperation("上传安全日志")
+    @PostMapping("updateLog")
+    public Result updateLog(AppSecurityLogDTO dto) {
+        return securityLogService.updateLog(dto);
+    }
+
+}

+ 14 - 0
src/main/java/com/om/entity/dto/AppSecurityLogDTO.java

@@ -0,0 +1,14 @@
+package com.om.entity.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.springframework.web.multipart.MultipartFile;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@NoArgsConstructor
+public class AppSecurityLogDTO extends AppBaseDTO{
+
+    private MultipartFile file;
+}

+ 3 - 0
src/main/java/com/om/entity/dto/DiagnoseLogVehicleInfo.java

@@ -47,4 +47,7 @@ public class DiagnoseLogVehicleInfo {
 
     @ApiModelProperty(value = "车辆识别代码")
     private String vin;
+
+    @ApiModelProperty(value = "控制器信息")
+    private String controllerInformation;
 }

+ 18 - 0
src/main/java/com/om/entity/dto/SecurityLogQueryPageDTO.java

@@ -0,0 +1,18 @@
+package com.om.entity.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class SecurityLogQueryPageDTO {
+    @ApiModelProperty(value = "当前页码")
+    private Integer pageIndex;
+
+    @ApiModelProperty(value = "每个页码的大小")
+    private Integer pageSize;
+
+    @ApiModelProperty(value = "搜索字段---搜索用户名")
+    private String username;
+}

+ 57 - 0
src/main/java/com/om/entity/po/SecurityLog.java

@@ -0,0 +1,57 @@
+package com.om.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author bmmx
+ * @since 2024-04-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("security_log")
+@ApiModel(value="SecurityLog对象", description="")
+public class SecurityLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "安全日志主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "用户名")
+    private String userName;
+
+    @ApiModelProperty(value = "ip地址")
+    private String ip;
+
+    @ApiModelProperty(value = "事件类型")
+    private String eventType;
+
+    @ApiModelProperty(value = "事件详情")
+    private String eventDetails;
+
+    @ApiModelProperty(value = "事件级别")
+    private String eventLevel;
+
+    @ApiModelProperty(value = "时间戳")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+
+}

+ 32 - 0
src/main/java/com/om/entity/vo/SecurityLogQueryPageVO.java

@@ -0,0 +1,32 @@
+package com.om.entity.vo;
+
+import com.om.entity.po.SecurityLog;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+public class SecurityLogQueryPageVO {
+
+    @ApiModelProperty(value = "当前页码")
+    private Integer current;
+
+    @ApiModelProperty(value = "总页码")
+    private Integer pages;
+
+    @ApiModelProperty(value = "每个页码的大小")
+    private Integer size;
+
+    @ApiModelProperty(value = "总数量")
+    private Integer total;
+
+    @ApiModelProperty(value = "是否是查询")
+    private Boolean searchCount = false;
+
+    @ApiModelProperty(value = "结果集")
+    private List<SecurityLog> records;
+
+}

+ 16 - 0
src/main/java/com/om/mapper/SecurityLogMapper.java

@@ -0,0 +1,16 @@
+package com.om.mapper;
+
+import com.om.entity.po.SecurityLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author bmmx
+ * @since 2024-04-27
+ */
+public interface SecurityLogMapper extends BaseMapper<SecurityLog> {
+
+}

+ 23 - 0
src/main/java/com/om/service/ISecurityLogService.java

@@ -0,0 +1,23 @@
+package com.om.service;
+
+import com.om.entity.dto.AppSecurityLogDTO;
+import com.om.entity.dto.SecurityLogQueryPageDTO;
+import com.om.entity.po.SecurityLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.om.entity.vo.SecurityLogQueryPageVO;
+import com.om.utils.Result;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author bmmx
+ * @since 2024-04-27
+ */
+public interface ISecurityLogService extends IService<SecurityLog> {
+
+    Result updateLog(AppSecurityLogDTO dto);
+
+    Result<SecurityLogQueryPageVO> getPageList(SecurityLogQueryPageDTO dto);
+}

+ 0 - 1
src/main/java/com/om/service/impl/DiagnosticLogServiceImpl.java

@@ -182,7 +182,6 @@ public class DiagnosticLogServiceImpl extends ServiceImpl<DiagnosticLogMapper, D
             diagnosticLog.setBrandId(brand.getId());
             diagnosticLog.setCreateTime(LocalDateTime.now());
             diagnosticLog.setUpdateTime(LocalDateTime.now());
-            //todo 上传
             this.save(diagnosticLog);
         }
 

+ 86 - 0
src/main/java/com/om/service/impl/SecurityLogServiceImpl.java

@@ -0,0 +1,86 @@
+package com.om.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.om.entity.dto.AppSecurityLogDTO;
+import com.om.entity.dto.GuidDTO;
+import com.om.entity.dto.SecurityLogQueryPageDTO;
+import com.om.entity.po.BrushDescription;
+import com.om.entity.po.BrushFile;
+import com.om.entity.po.SecurityLog;
+import com.om.entity.vo.BlushQueryPageVO;
+import com.om.entity.vo.BrushDescriptionVO;
+import com.om.entity.vo.BrushVO;
+import com.om.entity.vo.SecurityLogQueryPageVO;
+import com.om.mapper.SecurityLogMapper;
+import com.om.service.ISecurityLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.om.utils.AesUtil;
+import com.om.utils.Result;
+import com.om.utils.SecurityLogUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author bmmx
+ * @since 2024-04-27
+ */
+@Service
+@Slf4j
+public class SecurityLogServiceImpl extends ServiceImpl<SecurityLogMapper, SecurityLog> implements ISecurityLogService {
+
+
+    @Override
+    @Transactional
+    public Result updateLog(AppSecurityLogDTO dto) {
+        //从dto中获取数据
+        MultipartFile file = dto.getFile();
+        String guid = dto.getGuid();
+        GuidDTO guidDTO = AesUtil.getGuidDTOFromGuid(guid);
+
+        List<SecurityLog> securityLogs = SecurityLogUtil.parseLogFile(file);
+
+        return Result.ok(this.saveBatch(securityLogs));
+    }
+
+    @Override
+    public Result<SecurityLogQueryPageVO> getPageList(SecurityLogQueryPageDTO dto) {
+        Integer pageIndex = dto.getPageIndex();
+        Integer pageSize = dto.getPageSize();
+        String username = dto.getUsername();
+
+        Page<SecurityLog> page = this.lambdaQuery()
+                .like(StringUtils.isNotBlank(username), SecurityLog::getUserName, username)
+                .orderByDesc(SecurityLog::getCreateTime)
+                .page(new Page<>(pageIndex, pageSize));
+
+
+        //封装vo
+        SecurityLogQueryPageVO vo = new SecurityLogQueryPageVO();
+        vo.setCurrent((int) page.getCurrent());
+        vo.setSize((int) page.getSize());
+        vo.setPages((int) page.getPages());
+        vo.setTotal((int) page.getTotal());
+        if (StringUtils.isNotBlank(username)) {
+            vo.setSearchCount(true);
+        }
+
+        List<SecurityLog> records = page.getRecords();
+        if (records.isEmpty()){
+            return Result.ok(vo);
+        }
+        vo.setRecords(records);
+        return Result.ok(vo);
+    }
+}

+ 3 - 1
src/main/java/com/om/utils/AesUtil.java

@@ -4,11 +4,13 @@ package com.om.utils;
 
 import com.om.entity.dto.GuidDTO;
 import com.om.entity.dto.ObsDTO;
+import com.om.exception.BizException;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.lang3.StringUtils;
 
 import javax.crypto.Cipher;
 import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -92,7 +94,7 @@ public class AesUtil {
             GuidDTO guidDTO = parseGuidDTO(decrypt);
             return guidDTO;
         } catch (Exception e) {
-            throw new RuntimeException(e);
+            throw new BizException("guid转换失败");
         }
     }
     public static GuidDTO parseGuidDTO(String guid) {

+ 125 - 0
src/main/java/com/om/utils/SecurityLogUtil.java

@@ -0,0 +1,125 @@
+package com.om.utils;
+
+import com.om.entity.po.SecurityLog;
+import lombok.extern.log4j.Log4j;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Slf4j
+public class SecurityLogUtil {
+    private static final byte XOR_KEY = 0x33;
+    public static String decryptString(String encryptedHex) {
+        // 将16进制字符串转换为byte数组
+        byte[] encryptedBytes = new byte[encryptedHex.length() / 2];
+        for (int i = 0; i < encryptedHex.length(); i += 2) {
+            String hexPair = encryptedHex.substring(i, i + 2);
+            int decimal = Integer.parseInt(hexPair, 16);
+            encryptedBytes[i / 2] = (byte) (decimal & 0xff);
+        }
+
+        // 对byte数组进行异或操作以解密
+        byte[] decryptedBytes = new byte[encryptedBytes.length];
+        for (int i = 0; i < encryptedBytes.length; i++) {
+            decryptedBytes[i] = (byte) (encryptedBytes[i] ^ XOR_KEY);
+        }
+
+        // 将解密后的byte数组转换回字符串
+        return new String(decryptedBytes, StandardCharsets.UTF_8);
+    }
+
+
+    public static SecurityLog parseLogString(String logString) {
+        SecurityLog securityLog = new SecurityLog();
+        // 正则表达式
+        String regex = "\\[(.*?)\\] UserName: (.*?), IP: \\{.*?sourceAddress\":\"(.*?)\".*?\\}, EventType: (.*?), EventDetails: (.*?), EventLevel: (\\w+)";
+        Pattern pattern = Pattern.compile(regex);
+        Matcher matcher = pattern.matcher(logString);
+
+        if (matcher.find()) {
+            // 提取匹配到的数据
+            String timestampStr = matcher.group(1);
+            String userName = matcher.group(2);
+            String ipAddress = matcher.group(3);
+            String eventType = matcher.group(4);
+            String eventDetails = matcher.group(5);
+            String eventLevel = matcher.group(6);
+
+            // 将字符串时间戳转换为 LocalDateTime 对象(这里假设时间戳格式固定)
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            LocalDateTime timestamp = LocalDateTime.parse(timestampStr.substring(0, timestampStr.length()),formatter);
+
+            // 打印提取到的数据
+            securityLog.setCreateTime(timestamp);
+            securityLog.setIp(ipAddress);
+            securityLog.setEventLevel(eventLevel);
+            securityLog.setEventDetails(eventDetails);
+            securityLog.setUserName(userName);
+            securityLog.setEventType(eventType);
+        } else {
+            log.error("没有匹配成功");
+        }
+
+        return securityLog;
+    }
+
+    public static List<SecurityLog> parseLogFile(MultipartFile file) {
+        List<SecurityLog> logList = new ArrayList<>();
+        try {
+            // 获取 MultipartFile 的输入流
+            InputStream inputStream = file.getInputStream();
+            // 构造 InputStreamReader
+            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
+            // 构造 BufferedReader
+            BufferedReader reader = new BufferedReader(inputStreamReader);
+            // 读取文件直到到达末尾
+            String line;
+            while ((line = reader.readLine()) != null) {
+                SecurityLog securityLog = parseLogString(decryptString(line));
+                logList.add(securityLog);
+            }
+
+            // 关闭 BufferedReader
+            reader.close();
+        } catch (IOException e) {
+            // 捕获可能的异常
+            e.printStackTrace();
+        }
+        return logList;
+    }
+
+    public static void main(String[] args) {
+        String filePath = "security_log_en .txt"; // 指定要读取的文本文件路径
+
+        try {
+            // 创建一个 BufferedReader 对象来读取文件
+            BufferedReader reader = new BufferedReader(new FileReader(filePath));
+            // 读取文件直到到达末尾
+            String line;
+            while ((line = reader.readLine()) != null) {
+                SecurityLog securityLog = parseLogString(decryptString(line));
+                System.out.println(securityLog);
+            }
+
+            // 关闭 BufferedReader
+            reader.close();
+        } catch (IOException e) {
+            // 捕获可能的异常
+            e.printStackTrace();
+        }
+
+
+
+    }
+
+
+
+}

+ 5 - 0
src/main/resources/mapper/SecurityLogMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.om.mapper.SecurityLogMapper">
+
+</mapper>