Ofuscar documento na URI exibida em log

6 respostas Resolvido
webspring-boot
J

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/[telefone removido]
/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?

6 Respostas

L

Vc precisa ofuscar isso somente no log? Acho que não entendi 100% do que vc precisa fazer não.

J

Desculpe por não ter sido tão claro, mas é isso que você disse, preciso ofuscar somente no log!

L

Como que vc está realizando esse log? Dependendo de como for, vc talvez consiga resolver isso com AOP.

J

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?

L
Solucao aceita

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);
J

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();
    }

}
Criado 7 de abril de 2020
Ultima resposta 7 de abr. de 2020
Respostas 6
Participantes 2