Как замаскировать входную строку в Spring-Shell

Я использую Spring-Shell, и я хотел бы замаскировать ввод при вводе поля пароля для конкретного метода.

Просматривая в Интернете и здесь, на форуме, я обнаружил, что многие люди предлагают использовать команду console.readPassword(), но создание консоли из среды IDE дает мне нулевой результат.

Scanner in= new Scanner(System.in)
-------------------------------OR------------------------------------
BufferedReader in = new BufferedReader(new InputStreamReader(System.in)

это строки кода, которые я пытался получить от пользователя, но я не могу найти способ замаскировать ввод, поэтому, когда кто-то вводит пароль, он отображается на экране.

Оглядываясь вокруг, я обнаружил, что для работы консоли можно использовать внешний терминал вместо IDE, но при запуске SpringBoot (проект Spring-Shell) я получаю предупреждение Jline:

Msgstr "Невозможно создать системный терминал, создание немого терминала (включите ведение журнала отладки для получения дополнительной информации)".

Так есть ли простой способ замаскировать пароль с помощью scanner/BufferedReader классы, или мне нужно, чтобы системный терминал использовал консоль?

Спасибо

0 ответов

Вы можете использовать org.jline.reader.LineReader из библиотеки JLine, которую вы получаете по умолчанию в приложении Spring Shell.

Вот пример кода:

import org.jline.reader.LineReader;

public class InputReader {

private static final Character DEFAULT_MASK = '*';

private Character mask;
private LineReader lineReader;

public InputReader(LineReader lineReader) {
    this(lineReader, null);
}

public InputReader(LineReader lineReader, Character mask) {
    this.lineReader = lineReader;
    this.mask = mask != null ? mask : DEFAULT_MASK;
}

public String prompt(String  prompt) {
    return prompt(prompt, true);
}

public String prompt(String  prompt, boolean echo) {
    String answer;
    if (echo) {
        answer = lineReader.readLine(prompt + ": ");
    } else {
        answer = lineReader.readLine(prompt + ": ", mask);
    }
    return answer;
}

}

Затем сделайте это bean:

@Bean
public InputReader inputReader(@Lazy LineReader lineReader) {
    return new InputReader(lineReader);
}

и, наконец, используйте его в своем приложении:

@ShellComponent
public class YourShellComponent {

private final InputReader inputReader;

@Autowired
public YourShellComponent(InputReader inputReader) {
    this.inputReader = inputReader;
}

@ShellMethod(value = "connect")
public void connect() throws Exception {
    String username = this.inputReader.prompt("Username");
    String password = this.inputReader.prompt("Password", false);

    // other code
}
}
Другие вопросы по тегам