> 技术文档 > 最新Spring Security实战教程(十八)安全日志与审计:关键操作追踪与风险预警_spring security的审计日志

最新Spring Security实战教程(十八)安全日志与审计:关键操作追踪与风险预警_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. 前言
  • 2. Spring Security审计架构设计
      • 2.1 系统架构
      • 2.2 审计日志四要素
      • 2.3 技术栈选择
  • 3. 数据库与实体设计
      • 3.1 数据表 (MySQL)
      • 3.2 实体与 Mapper
  • 4. 事件采集:Spring AOP + 自定义注解
      • 4.1 自定义注解 @Audit
      • 4.2 AOP 切面记录和发布事件
      • 4.3 事件类
      • 4.4 事件监听并保存日志
  • 5. Drools 动态规则引擎
      • 5.1 配置 DroolsConfig
      • 5.2 示例规则 (audit-risk.drl)
  • 6. 监控指标采集与可视化
      • 6.1 添加监控依赖并启用 Actuator
      • 6.2 自定义 Prometheus 指标
  • 7. 控制器示例
  • 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 系统架构

我们常见的安全审计应该具备以下基础:以博主目前所在公司使用的系统架构如下图
最新Spring Security实战教程(十八)安全日志与审计:关键操作追踪与风险预警_spring security的审计日志

2.2 审计日志四要素

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

2.3 技术栈选择

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

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

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

<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)

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

@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@Mapperpublic interface AuditLogMapper extends BaseMapper<AuditLog> {}

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

4.1 自定义注解 @Audit

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

@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface Audit { String action(); String resource();}

4.2 AOP 切面记录和发布事件

@Aspect @Componentpublic 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 事件类

public record AuditEvent(String username, String action, String resource, long duration, LocalDateTime timestamp) {}

4.4 事件监听并保存日志

@Component@RequiredArgsConstructorpublic 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

@Configurationpublic 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)

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

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

6.1 添加监控依赖并启用 Actuator

<dependency>io.micrometer:micrometer-registry-prometheus</dependency><dependency>org.springframework.boot:starter-actuator</dependency>

配置:

management: endpoints: web: exposure: include: prometheus,health

6.2 自定义 Prometheus 指标

@Configurationpublic 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进行相关测试

@RestController@RequestMapping(\"/api\")@RequiredArgsConstructorpublic 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 警报等高级功能。

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


在这里插入图片描述