最新Spring Security实战教程(十八)安全日志与审计:关键操作追踪与风险预警

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志

🎐 个人CSND主页------Micro麦可乐的博客

🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战

🌺《RabbitMQ》专栏19年编写主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战

🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解

🌛《开源项目》本专栏主要介绍目前热门的开源项目,带大家快速了解并轻松上手使用

🍎 《前端技术》专栏以实战为主介绍日常开发中前端应用的一些功能以及技巧,均附有完整的代码示例

✨《开发技巧》本专栏包含了各种系统的设计原理以及注意事项,并分享一些日常开发的功能小技巧

💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程

🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整

👍《Spring Security》专栏中我们将逐步深入Spring Security的各个技术细节,带你从入门到精通,全面掌握这一安全技术
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

最新Spring Security实战教程(十八)安全日志与审计:关键操作追踪与风险预警

  • [1. 前言](#1. 前言)
  • [2. Spring Security审计架构设计](#2. Spring Security审计架构设计)
      • [2.1 系统架构](#2.1 系统架构)
      • [2.2 审计日志四要素](#2.2 审计日志四要素)
      • [2.3 技术栈选择](#2.3 技术栈选择)
  • [3. 数据库与实体设计](#3. 数据库与实体设计)
      • [3.1 数据表 (MySQL)](#3.1 数据表 (MySQL))
      • [3.2 实体与 Mapper](#3.2 实体与 Mapper)
  • [4. 事件采集:Spring AOP + 自定义注解](#4. 事件采集:Spring AOP + 自定义注解)
      • [4.1 自定义注解 @Audit](#4.1 自定义注解 @Audit)
      • [4.2 AOP 切面记录和发布事件](#4.2 AOP 切面记录和发布事件)
      • [4.3 事件类](#4.3 事件类)
      • [4.4 事件监听并保存日志](#4.4 事件监听并保存日志)
  • [5. Drools 动态规则引擎](#5. Drools 动态规则引擎)
      • [5.1 配置 DroolsConfig](#5.1 配置 DroolsConfig)
      • [5.2 示例规则 (audit-risk.drl)](#5.2 示例规则 (audit-risk.drl))
  • [6. 监控指标采集与可视化](#6. 监控指标采集与可视化)
      • [6.1 添加监控依赖并启用 Actuator](#6.1 添加监控依赖并启用 Actuator)
      • [6.2 自定义 Prometheus 指标](#6.2 自定义 Prometheus 指标)
  • [7. 控制器示例](#7. 控制器示例)
  • [8. 结语](#8. 结语)

回顾链接:
最新Spring Security实战教程(一)初识Spring Security安全框架
最新Spring Security实战教程(二)表单登录定制到处理逻辑的深度改造
最新Spring Security实战教程(三)Spring Security 的底层原理解析
最新Spring Security实战教程(四)基于内存的用户认证
最新Spring Security实战教程(五)基于数据库的动态用户认证传统RBAC角色模型实战开发
最新Spring Security实战教程(六)最新Spring Security实战教程(六)基于数据库的ABAC属性权限模型实战开发
最新Spring Security实战教程(七)方法级安全控制@PreAuthorize注解的灵活运用
最新Spring Security实战教程(八)Remember-Me实现原理 - 持久化令牌与安全存储方案
最新Spring Security实战教程(九)前后端分离认证实战 - JWT+SpringSecurity无缝整合
最新Spring Security实战教程(十)权限表达式进阶 - 在SpEL在安全控制中的高阶魔法
最新Spring Security实战教程(十一)CSRF攻防实战 - 从原理到防护的最佳实践
最新Spring Security实战教程(十二)CORS安全配置 - 跨域请求的安全边界设定
最新Spring Security实战教程(十三)会话管理机制 - 并发控制与会话固定攻击防护
最新Spring Security实战教程(十四)OAuth2.0精讲 - 四种授权模式与资源服务器搭建
最新Spring Security实战教程(十五)快速集成 GitHub 与 Gitee 的社交登录
最新Spring Security实战教程(十六)微服务间安全通信 - JWT令牌传递与校验机制
最新Spring Security实战教程(十七)企业级安全方案设计 - 多因素认证(MFA)实现

1. 前言

在我们日常开发系统在安全架构中,仅仅通过认证和授权往往不足以满足合规、溯源、风险预警等需求。企业级系统必须记录并分析 谁在什么时候对什么资源做了什么操作 ,并结合规则引擎识别异常行为,及时告警。

安全审计作为企业防护的最后一道防线,能有效追踪异常行为、还原攻击链、满足合规要求。本文博主将带着大家基于 Spring Security 构建完整的安全审计系统,实现关键操作追踪与实时风险预警。


2. Spring Security审计架构设计

2.1 系统架构

我们常见的安全审计应该具备以下基础:以博主目前所在公司使用的系统架构如下图

2.2 审计日志四要素

要素 说明 示例
主体 操作执行者 用户ID、IP地址
客体 被操作对象 数据ID、接口路径
动作 操作类型 登录、删除、授权变更
环境 操作上下文 时间、设备、地理位置

2.3 技术栈选择

  • 事件采集Spring AOP + ApplicationEvent
  • 存储方案MySQL+ MyBatis‑Plus(中小型应用适用) 或 Elasticsearch + Logstash(大型应用 + 实时检索)
  • 风险分析Drools规则引擎
  • 可视化Grafana监控看板

这里博主为了简化方便演示,本文就以 mysql + MyBatis‑Plus 为存储方案~

鉴于之前的子模块代码中,我们已经集成好了 mysql + MyBatis‑Plus , 在开始之前我们复用之前的子模块,在pom需要引入:

xml 复制代码
<dependency>
	<groupId>org.drools</groupId>
	<artifactId>drools-core</artifactId>
	<version>9.44.0.Final</version>
</dependency>
<dependency>
	<groupId>org.kie</groupId>
	<artifactId>kie-spring</artifactId>
	<version>7.74.1.Final</version>
</dependency>

3. 数据库与实体设计

3.1 数据表 (MySQL)

sql 复制代码
CREATE TABLE audit_log (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50),
  action VARCHAR(100),
  resource VARCHAR(200),
  timestamp DATETIME,
  duration BIGINT
);

3.2 实体与 Mapper

java 复制代码
@Data 
@TableName("audit_log")
public class AuditLog {
  @TableId(type = IdType.AUTO) 
  private Long id;
  private String username;
  private String action;
  private String resource;
  private LocalDateTime timestamp;
  private Long duration;
}

// Mapper
@Mapper
public interface AuditLogMapper extends BaseMapper<AuditLog> {}

4. 事件采集:Spring AOP + 自定义注解

4.1 自定义注解 @Audit

自定义注解,作用于让AOP切面发现

java 复制代码
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Audit {
    String action();
    String resource();
}

4.2 AOP 切面记录和发布事件

java 复制代码
@Aspect 
@Component
public class AuditAspect {
    @Autowired 
    private ApplicationEventPublisher publisher;

    @Pointcut("@annotation(audit)")
    public void auditPoint(Audit audit) {}

    @Around("auditPoint(audit)")
    public Object around(ProceedingJoinPoint jp, Audit audit) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = jp.proceed();
        long duration = System.currentTimeMillis() - start;

        MethodSignature ms = (MethodSignature) jp.getSignature();
        String username = ((UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername();

        AuditEvent evt = new AuditEvent(username, audit.action(), audit.resource(), duration, LocalDateTime.now());
        publisher.publishEvent(evt);
        return result;
    }
}

上述代码中:可补充捕获异常并发布失败事件

4.3 事件类

java 复制代码
public record AuditEvent(String username, String action,
                         String resource, long duration,
                         LocalDateTime timestamp) {}

4.4 事件监听并保存日志

java 复制代码
@Component
@RequiredArgsConstructor
public class AuditListener {
  private final AuditLogMapper mapper;
  private final KieContainer kieContainer;
  private final Counter riskCounter; // Prometheus counter

  @EventListener
  public void handle(AuditEvent evt) {
    AuditLog log = new AuditLog(null, evt.username(),
        evt.action(), evt.resource(),
        evt.timestamp(), evt.duration());
    mapper.insert(log);

    var session = kieContainer.newKieSession();
    session.insert(log);
    var fired = session.fireAllRules();
    session.dispose();

    if (fired > 0) riskCounter.increment();
  }
}

5. Drools 动态规则引擎

5.1 配置 DroolsConfig

java 复制代码
@Configuration
public class DroolsConfig {
  @Bean
  public KieContainer kieContainer() {
    KieServices ks = KieServices.Factory.get();
    KieFileSystem kfs = ks.newKieFileSystem();
    kfs.write(ResourceFactory.newClassPathResource("rules/audit-risk.drl"));
    ks.newKieBuilder(kfs).buildAll();
    return ks.newKieContainer(
      ks.getRepository().getDefaultReleaseId());
  }
}

5.2 示例规则 (audit-risk.drl)

bash 复制代码
rule "Slow Audit"
when
  $log: AuditLog(duration > 1000)
then
  System.out.println("风险预警:操作耗时过长 by " + $log.getUsername());
end

6. 监控指标采集与可视化

6.1 添加监控依赖并启用 Actuator

xml 复制代码
<dependency>io.micrometer:micrometer-registry-prometheus</dependency>
<dependency>org.springframework.boot:starter-actuator</dependency>

配置:

yml 复制代码
management:
  endpoints:
    web:
      exposure:
        include: prometheus,health

6.2 自定义 Prometheus 指标

java 复制代码
@Configuration
public class MetricsConfig {
  @Bean
  public Counter riskCounter(MeterRegistry reg) {
    return Counter.builder("audit.risk.count")
      .description("Number of risky audit events")
      .register(reg);
  }
}

Prometheus 采集 /actuator/prometheusGrafana 仪表板配置查询:audit_risk_count

7. 控制器示例

完成了上述所有操作后,我们可以编写一个Controller进行相关测试

java 复制代码
@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class DemoController {
  @Audit(action="ACCESS", resource="demoEndpoint")
  @GetMapping("/demo")
  public String demo() {
    return "OK";
  }
}

8. 结语

本章节我们以最简单的一个入门示例,主要讲解了

  • 利用 MyBatis‑Plus 实现高效、自动化地操作 MySQL 审计日志表
  • 通过 Spring AOP + ApplicationEvent 实现操作日志透明采集
  • 使用 Drools 规则引擎 实现可配置、实时化的风险判断
  • 集成 Prometheus + Grafana 实现可视化监控,从流量、耗时、风险事件维度全方位审计系统行为

这套方案可按需扩展为审计超级系统,支持敏感操作追踪、异常报警、人机判定等功能,适合企业级复杂场景。后续可添加 CI/CD 自动部署 Drools 规则、Grafana 警报等高级功能。

如果你在实践过程中有任何疑问或更好的扩展思路,欢迎在评论区留言,最后希望大家 一键三连 给博主一点点鼓励!


相关推荐
带刺的坐椅几秒前
Solon AI 五步构建 RAG 服务:2025 最新 AI + 向量数据库实战
java·redis·ai·solon·rag
东阳马生架构38 分钟前
商品中心—7.自研缓存框架的技术文档
java
林太白40 分钟前
Rust-连接数据库
前端·后端·rust
bug菌1 小时前
CAP定理真的是死结?业务系统到底该怎么取舍!
分布式·后端·架构
林太白1 小时前
Rust认识安装
前端·后端·rust
掘金酱1 小时前
🔥 稀土掘金 x Trae 夏日寻宝之旅火热进行ing:做任务赢大疆pocket3、Apple watch等丰富大礼
前端·后端·trae
xiayz1 小时前
引入mapstruct实现类的转换
后端
Java微观世界1 小时前
深入解析:Java中的原码、反码、补码——程序员的二进制必修课
后端
不想说话的麋鹿1 小时前
《NestJS 实战:RBAC 系统管理模块开发 (四)》:用户绑定
前端·后端·全栈
Java水解2 小时前
JavaScript 正则表达式
javascript·后端