Как перехватить метод регистрации до того, как будет передан его аргумент?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как перехватить метод регистрации до того, как будет передан его аргумент?

Сообщение Anonymous »

Я работаю над проектом Java, где пытаюсь использовать Spring AOP для создания средства ведения журнала, маскирующего данные, позволяющие идентифицировать личность. Подход заключается в том, чтобы иметь что-то декларативное. Следуя некоторым руководствам, я придумал аннотацию, которая используется для разграничения данных, позволяющих идентифицировать личность:

Код: Выделить всё

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface Confidential {
}
У меня есть POJO, в котором метод получения помечен типом @Confidential:

Код: Выделить всё

public class PiiPojo {
@Confidential
private String secretName;
... other fields here ...

@Confidential
public String getSecretName() {
return secretName;
}
}
Мой аспект выглядит так:

Код: Выделить всё

@Aspect
public class PIILoggerAspect {
@Around("execution(* org.slf4j.Logger.*(..))")
public Object piiMasker(ProceedingJoinPoint joinPoint) throws Throwable {
var joinPointArgs = joinPoint.getArgs();
// ... PII masking stuff here ...

return joinPoint.proceed();
}
}
Код, выполняющий ведение журнала, использует делегирующий «шпон» над интерфейсом slf4j Logger, поскольку пытается использовать значение по умолчанию из org.slf4j.LoggerFactory.getLogger() приводит к ошибке CGLIB, поскольку класс реализации является окончательным.
Код, выполняющий регистрацию, использует делегирующий регистратор для регистрации такой информации:

Код: Выделить всё

// Log information from the PII POJO
public void someMethod(PiiPojo pojo) {
log.info("Passing in secret name: {}", pojo.getSecretName());
}
Аспект правильно перехватывает вызов, но метод получения уже был вызван в POJO, поэтому я просто получаю значение String из pojo.getSecretName()
code>, и я не знаю, являются ли это данные, которые я должен маскировать, а не просто любую случайную строку, которую кто-то передает в регистратор. Я попытался изменить выражение в аспекте, чтобы также учесть аннотацию, но как только я это сделаю, аспект больше не перехватывает вызов log.info(). Пример:

Код: Выделить всё

@Around("execution(* org.slf4j.Logger.*(..)) && @annotation(Confidential)")
и

Код: Выделить всё

@Around("@annotation(confidential) && execution(* org.slf4j.Logger.*(..))")
public Object piiMasker(ProceedingJoinPoint joinPoint, Confidential confidential) throws Throwable {

Облицовка лесозаготовок выглядит примерно так:

Код: Выделить всё

import org.slf4j.Logger;
import org.slf4j.Marker;

public class MyLogger implements org.slf4j.Logger {
private final Logger log;

public MyLogger(Logger log) {
this.log = log;
}

public void info(String msg) {
log.info(msg);
}

... other methods here ...
}
Кажется, я не получаю никаких ошибок относительно выражения, но метод перехвата аспектов просто больше не вызывается, как только я добавляю && @annotation. Я пробовал использовать в выражении пакетную часть типа аннотации и без нее, но, похоже, это не имеет значения. Некоторые другие подробности:
  • Аспект создается в аннотированном конфигурационном файле Spring @Configuration как @Bean.
    Файл конфигурации помечен с помощью @EnableAspectJAutoProxy.
  • Регистратор «шпона» создается с использованием @Bean и передается в него. через внедрение конструктора в класс, где он используется.
В идеале мне хотелось бы перехватить любой вызов метода регистратора, но только в контексте @Confidential аннотация.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -passed-in
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»