Merge branch 'feature/SUPPORT-8706_condition' into hotfix/1.9.9

This commit is contained in:
adel.ka 2025-03-06 11:49:03 +03:00
commit 8478e67fe3
9 changed files with 113 additions and 40 deletions

View file

@ -0,0 +1,19 @@
package ru.micord.ervu.audit.config;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* @author Adel Kalimullin
*/
public class AuditDisabledCondition implements Condition {
private static final String AUDIT_ENABLED_PROPERTY_NAME = "audit.kafka.enabled";
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment env = context.getEnvironment();
return !Boolean.parseBoolean(env.getProperty(AUDIT_ENABLED_PROPERTY_NAME));
}
}

View file

@ -0,0 +1,20 @@
package ru.micord.ervu.audit.config;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* @author Adel Kalimullin
*/
public class AuditEnabledCondition implements Condition {
private static final String AUDIT_ENABLED_PROPERTY_NAME = "audit.kafka.enabled";
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment env = context.getEnvironment();
return Boolean.parseBoolean(env.getProperty(AUDIT_ENABLED_PROPERTY_NAME));
}
}

View file

@ -11,6 +11,7 @@ import org.apache.kafka.common.config.SaslConfigs;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.config.TopicBuilder;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
@ -22,6 +23,7 @@ import org.springframework.kafka.core.ProducerFactory;
* @author Adel Kalimullin
*/
@Configuration
@Conditional(AuditEnabledCondition.class)
public class AuditKafkaConfig {
@Value("${audit.kafka.bootstrap.servers}")
private String bootstrapServers;
@ -35,11 +37,11 @@ public class AuditKafkaConfig {
private String password;
@Value("${audit.kafka.sasl.mechanism}")
private String saslMechanism;
@Value("${audit.kafka.authorization.topic}")
@Value("${audit.kafka.authorization.topic:ervu.lkrp.auth.events}")
private String authorizationTopic;
@Value("${audit.kafka.action.topic}")
@Value("${audit.kafka.action.topic:ervu.lkrp.action.events}")
private String actionTopic;
@Value("${audit.kafka.file.download.topic}")
@Value("${audit.kafka.file.download.topic:ervu.lkrp.import.file}")
private String fileDownloadTopic;
@Bean("auditProducerFactory")

View file

@ -3,20 +3,20 @@ package ru.micord.ervu.audit.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Conditional;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
import ru.micord.ervu.audit.config.AuditEnabledCondition;
import ru.micord.ervu.audit.service.AuditKafkaPublisher;
/**
* @author Adel Kalimullin
*/
@Service
@Conditional(AuditEnabledCondition.class)
public class BaseAuditKafkaPublisher implements AuditKafkaPublisher {
private static final Logger LOGGER = LoggerFactory.getLogger(BaseAuditKafkaPublisher.class);
private final KafkaTemplate<String, String> kafkaTemplate;
@Value("${audit.kafka.enabled}")
private boolean auditEnabled;
public BaseAuditKafkaPublisher(
@Qualifier("auditTemplate") KafkaTemplate<String, String> kafkaTemplate) {
@ -25,7 +25,6 @@ public class BaseAuditKafkaPublisher implements AuditKafkaPublisher {
@Override
public void publishEvent(String topic, String message) {
if (auditEnabled) {
kafkaTemplate.send(topic, message)
.addCallback(
result -> {
@ -35,8 +34,4 @@ public class BaseAuditKafkaPublisher implements AuditKafkaPublisher {
)
);
}
else {
LOGGER.info("Audit is disabled. Event not published.");
}
}
}

View file

@ -5,7 +5,9 @@ import javax.servlet.http.HttpServletRequest;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Conditional;
import org.springframework.stereotype.Service;
import ru.micord.ervu.audit.config.AuditEnabledCondition;
import ru.micord.ervu.audit.constants.AuditConstants;
import ru.micord.ervu.audit.model.AuditActionEvent;
import ru.micord.ervu.audit.model.AuditActionRequest;
@ -22,15 +24,16 @@ import ru.micord.ervu.util.NetworkUtils;
* @author Adel Kalimullin
*/
@Service
@Conditional(AuditEnabledCondition.class)
public class BaseAuditService implements AuditService {
private final AuditKafkaPublisher auditPublisher;
private final JwtTokenService jwtTokenService;
private final ObjectMapper objectMapper;
@Value("${audit.kafka.authorization.topic}")
@Value("${audit.kafka.authorization.topic:ervu.lkrp.auth.events}")
private String authorizationTopic;
@Value("${audit.kafka.action.topic}")
@Value("${audit.kafka.action.topic:ervu.lkrp.action.events}")
private String actionTopic;
@Value("${audit.kafka.file.download.topic}")
@Value("${audit.kafka.file.download.topic:ervu.lkrp.import.file}")
private String fileDownloadTopic;
public BaseAuditService(AuditKafkaPublisher auditPublisher, JwtTokenService jwtTokenService,

View file

@ -0,0 +1,32 @@
package ru.micord.ervu.audit.service.impl;
import javax.servlet.http.HttpServletRequest;
import org.springframework.context.annotation.Conditional;
import org.springframework.stereotype.Service;
import ru.micord.ervu.audit.config.AuditDisabledCondition;
import ru.micord.ervu.audit.model.AuditActionRequest;
import ru.micord.ervu.audit.service.AuditService;
import ru.micord.ervu.security.esia.model.PersonModel;
/**
* @author Adel Kalimullin
*/
@Service
@Conditional(AuditDisabledCondition.class)
public class StubAuditService implements AuditService {
@Override
public void processActionEvent(HttpServletRequest request,
AuditActionRequest auditActionRequest) {}
@Override
public void processAuthEvent(HttpServletRequest request, PersonModel personModel, String status,
String eventType) {
}
@Override
public void processDownloadEvent(HttpServletRequest request, int fileSize, String fileName,
String formatRegistry, String status) {
}
}

View file

@ -390,6 +390,7 @@ public class EsiaAuthService {
public String logout(HttpServletRequest request, HttpServletResponse response) {
PersonModel personModel = null;
String status = null;
try {
String userId = jwtTokenService.getUserAccountId(request);
String accessToken = EsiaAuthInfoStore.getAccessToken(userId);
@ -404,18 +405,19 @@ public class EsiaAuthService {
"client_id", esiaConfig.getClientId(),
"redirect_url", redirectUrl
);
auditService.processAuthEvent(
request, personModel, AuditConstants.SUCCESS_STATUS, AuditConstants.LOGOUT_EVENT_TYPE
);
status = AuditConstants.SUCCESS_STATUS;
return buildUrl(url, params);
}
catch (Exception e) {
status = AuditConstants.FAILURE_STATUS;
throw new EsiaException(e);
}
finally {
if (personModel != null){
auditService.processAuthEvent(
request, personModel, AuditConstants.FAILURE_STATUS, AuditConstants.LOGOUT_EVENT_TYPE
request, personModel, status, AuditConstants.LOGOUT_EVENT_TYPE
);
}
throw new EsiaException(e);
}
}