Senhores, tenho uma aplicação Spring boot na qual estou utilizando RestTemplate para realizar requisições em alguns clients, nessa aplicação coloquei uma classe interceptor para logar dados da request inicio/fim realizadas pelo client.
Problema: Imaginando que eu tenha as seguintes URL’s:
/api/recurso/{cpf}
/api/recurso/{cnpj}
Eu precisaria ofuscar parcialmente os documentos que aparecem no path.
Atualmente a aplicação faz o log da seguinte forma:
/api/recurso/00000000191
/api/recurso/00000000000191
Gostaria que o log ficasse desta forma:
/api/recurso/******00191
/api/recurso/********000191
Para isso criei uma classe que faz este trabalho:
@UtilityClass
public class UriUtils {
private static String REGEX_CPF_CNPJ = "((\\d{14})$)|((\\d{11})$)";
public static String pathOfuscator(String path) {
Matcher matcher = Pattern.compile(REGEX_CPF_CNPJ).matcher(path);
if (matcher.find()) {
if (matcher.group().length() == 11) {
path = path.substring(0, path.length() - 11);
path += "******".concat(matcher.group().substring(6, 11));
}
if (matcher.group().length() == 14) {
path = path.substring(0, path.length() - 14);
path += "********".concat(matcher.group().substring(8, 14));
}
}
return path;
}
}
Porém imaginando o seguinte cenário onde as URL’s fossem da seguinte forma:
/api/recursopai/{cpf}/recursofilho/{cnpj}
A minha classe já não atenderia, como eu poderia modelar a classe para que ela conseguisse ofuscar documentos no path para qualquer URL?
Vc precisa ofuscar isso somente no log? Acho que não entendi 100% do que vc precisa fazer não.
Desculpe por não ter sido tão claro, mas é isso que você disse, preciso ofuscar somente no log!
Como que vc está realizando esse log? Dependendo de como for, vc talvez consiga resolver isso com AOP.
Esse log especificamente das URL’s fica em uma classe client interceptor que intercepta e loga as request’s que os clients estão realizando internamente na aplicação.
Nessa classe fiz a chamada da classe e método que mandei acima, e ele ofusca esse cara no log, porém ela só está atendendo a URL’s em que o documento seja a última coisa na URL.
/api/recurso/{documento} <!-- A classe atende -->
/api/recursopai/{documento}/recursofilho/{documento} <!-- A classe não atende -->
Tem alguma forma que eu consiga fazer isso?
Como seria esse AOP, indica algum material?
Como vc já está usando interceptor, não precisa se preocupar com AOP não (que é uma forma mais robusta de interceptar com uns bagulhos a mais - bem top). Nesse seu caso basta apenas tratar a URL com regex mesmo.
Talvez vc tenha que tratar o regex com um laço:
String text = "a0a1a2a3a4a5a6a7a8a9";
Pattern pattern = Pattern.compile("([0-9])");
Matcher matcher = pattern.matcher(text);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "**");
}
matcher.appendTail(sb);
System.out.println(sb);
Massa, vou dar uma olhada sobre AOP, ainda não tive contato com esse cara!
Obrigado pela ajuda, ficou no formato que eu precisava!
Caso alguém precise segue formato final da classe:
@UtilityClass
public class UriUtils {
private static String REGEX_CPF_CNPJ = "(\\d{14})|(\\d{11})";
public static String pathObfuscator(String path) {
Matcher matcher = Pattern.compile(REGEX_CPF_CNPJ).matcher(path);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
if (matcher.group().length() == 11) {
matcher.appendReplacement(sb, "******".concat(matcher.group().substring(6, 11)));
}
if (matcher.group().length() == 14) {
matcher.appendReplacement(sb, "********".concat(matcher.group().substring(8, 14)));
}
}
matcher.appendTail(sb);
return sb.toString();
}
}
1 curtida