Как замаскировать входную строку в 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
}
}