>source

여러 민감한 값을 처리하는 Java 애플리케이션에서 작업 중입니다. 우리는 Lombok을 사용하고 있으며 아래와 같은 많은 데이터 클래스를 가지고 있습니다. 그러나 생성 된 toString이 제외 된 필드를 100 % 무시하므로 일부 중요한 필드가 포함되어 있다는 표시없이 로그에서 이러한 클래스를 보는 것은 혼란 스럽습니다. Lombok에서 다음과 같은 인쇄를 할 수 있습니까? clientSecret=<HIDDEN> 각 클래스에 대한 사용자 정의 toString을 작성하지 않고?

/** data we will send to token endpoint */
@Data
public class TokenReq {
    private String grantType;
    private String code;
    private String clientId;
    @ToString.Exclude
    private String refreshToken;
    @ToString.Exclude
    private String clientSecret;
    private String redirectUri;
}

  • 답변 # 1

    마스킹해야하는 필드를 제외하고 마스킹 된 값을 반환하는 도우미 메서드를 포함 할 수 있습니다.

    @Data
    public class TokenReq {
        @ToString.Exclude
        private String clientSecret;
        @ToString.Include(name="clientSecret")
        private String hiddenClientSecretForToString() {
            return "<HIDDEN>";
        }
    }
    
    

  • 답변 # 2

    댓글에서 말했듯이 이것은 내가 얼마 전에 한 방법이며 아마도 더 많은 작업이 필요하지만 여기에 아이디어가 있습니다.

    interface ToString {
        default String innerToString(String... exclusions) {
            Method[] allMethods = getClass().getDeclaredMethods();
            return Arrays.stream(allMethods)
                         .filter(x -> x.getName().startsWith("get"))
                         .map(x -> {
                             if (Arrays.stream(exclusions).anyMatch(y -> ("get" + y).equalsIgnoreCase(x.getName()))) {
                                 return x.getName().substring(3) + " = <HIDDEN>";
                             }
                             try {
                                 return x.getName().substring(3) + " = " + x.invoke(this);
                             } catch (Exception e) {
                                 throw new RuntimeException(e);
                             }
                         })
                         .collect(Collectors.joining(" "));
        }
    }
    
    

    그리고 수업 :

    static class Person implements ToString {
        private String name;
        private String password;
        // constructor/getter or lombok annotations
        public String toString() {
            return innerToString("password");
        }
    }
    
    

    그리고 사용법 :

    public static void main(String[] args) {
        Person p = new Person("eugene", "password");
        System.out.println(p);
    }
    
    

관련 자료

  • 이전 tree - 경로 계획을 위해 무게 그래프에서 도로 모양을 어떻게 표현할 수 있습니까?
  • 다음 vue.js - Webpack의 이름이 지정되지 않은 동적 청크는 숫자 대신 청크 번호로 명명됩니다