
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人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/prometheus
,Grafana
仪表板配置查询: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
警报等高级功能。
如果你在实践过程中有任何疑问或更好的扩展思路,欢迎在评论区留言,最后希望大家 一键三连 给博主一点点鼓励!
