package com.baiyue.common.audit; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.beans.factory.ObjectProvider; import org.springframework.web.client.RestClient; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.support.TransactionTemplate; /** * 业务审计自动配置,按配置创建脱敏器、审计输出端和审计切面。 */ @AutoConfiguration @EnableConfigurationProperties(AuditProperties.class) @ConditionalOnProperty(prefix = "baiyue.audit", name = "enabled", havingValue = "true", matchIfMissing = true) public class BaiyueAuditAutoConfiguration { @Bean @ConditionalOnMissingBean AuditSink auditSink(RestClient.Builder builder, AuditProperties p, ObjectMapper mapper, ObjectProvider outbox, ObjectProvider transactionManagers, @Value("${baiyue.security.internal-service-token:}") String internalServiceToken) { AuditOutboxRepository repository = outbox.getIfAvailable(); PlatformTransactionManager transactionManager = transactionManagers.getIfAvailable(); if (p.getOutbox().isEnabled() && p.getOutbox().isPublisherEnabled() && repository != null && transactionManager != null) { TransactionTemplate transactions = new TransactionTemplate(transactionManager); transactions.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); return new OutboxAuditSink(repository, mapper, transactions); } return p.getEndpoint() == null || p.getEndpoint().isBlank() ? new LoggingAuditSink() : new HttpAuditSink(builder, p.getEndpoint(), internalServiceToken); } @Bean @ConditionalOnBean(JdbcTemplate.class) @ConditionalOnProperty(prefix = "baiyue.audit.outbox", name = "enabled", havingValue = "true") AuditOutboxRepository auditOutboxRepository() { return new AuditOutboxRepository(); } @Bean SensitiveDataSanitizer sensitiveDataSanitizer(ObjectMapper mapper, AuditProperties p) { return new SensitiveDataSanitizer(mapper, p.getMaxPayloadLength()); } @Bean BusinessAuditAspect businessAuditAspect() { return new BusinessAuditAspect(); } }