#java #swing #jaas
#java #swing #jaas
Вопрос:
Проблема в том, что это приложение для входа в систему JAAS. Приведенный ниже метод использует класс обратного вызова Java, и это меня немного беспокоит. Поскольку он подключен к классу обратного вызова (среди прочего), стандарт
JTextfield username = Class.getText();
не работает. Ваши мысли приветствуются:
public boolean login() throws LoginException {
// prompt for a user name and password
if (callbackHandler == null)
throw new LoginException("Error: no CallbackHandler available "
"to garner authentication information from the user");
Callback[] callbacks = new Callback[2];
callbacks[0] = new NameCallback("user name: ");
callbacks[1] = new PasswordCallback("password: ", false);
try {
callbackHandler.handle(callbacks);
username = ((NameCallback)callbacks[0]).getName();
char[] tmpPassword = ((PasswordCallback)callbacks[1]).getPassword();
if (tmpPassword == null) {
// treat a NULL password as an empty password
tmpPassword = new char[0];
}
password = new char[tmpPassword.length];
System.arraycopy(tmpPassword, 0,
password, 0, tmpPassword.length);
((PasswordCallback)callbacks[1]).clearPassword();
} catch (java.io.IOException ioe) {
throw new LoginException(ioe.toString());
} catch (UnsupportedCallbackException uce) {
throw new LoginException("Error: " uce.getCallback().toString()
" not available to garner authentication information "
"from the user");
}
. . .
Комментарии:
1. Разве CallbackHandler не содержал бы код, который получает входные данные от пользователя, в данном случае вызывающий Swing-код, а затем возвращающий только после того, как пользователь закончит вводить данные? Возможно, это код, который вы должны показывать, а не код LoginModule. Какие у вас проблемы? Что вы пытаетесь сделать с этой строкой?
JTextfield username = Class.getText();
поскольку для меня это не имеет смысла.2. Привет, судно на воздушной подушке, полное угрей. Я хотел бы сердечно поблагодарить вас за ваш комментарий ранее сегодня. Я указал мне правильное направление и дал мне знать, что я не понял весь процесс обратного вызова так хорошо, как следовало бы. Итак, несколько часов спустя после перерыва и бокала вина (или двух 🙂 В итоге я поместил оператор вызова JTextField в свой обработчик обратного вызова! И ого! Это работает . . . мило! Миллион благодарностей!
Ответ №1:
Благодаря судну на воздушной подушке, полному угрей, указывающему мне правильное направление, я смог это выяснить. Ниже приведен правильный код в обработчике my Callback (не мой модуль входа в систему, как я изначально описал выше):
public void handle(Callback[] callbacks)throws IOException, UnsupportedCallbackException
{
for (int i = 0; i < callbacks.length; i )
{
if
{
. . . .
}
else if (callbacks[i] instanceof NameCallback)
{
// prompt the user for a username
NameCallback nc = (NameCallback)callbacks[i];
System.err.print(nc.getPrompt());
System.err.flush();
nc.setName(Video_Game_Store.usrName.getText());
}
else if (callbacks[i] instanceof PasswordCallback)
{
// prompt the user for sensitive information
PasswordCallback pc = (PasswordCallback)callbacks[i];
System.err.print(pc.getPrompt());
System.err.flush();
pc.setPassword(Video_Game_Store.psWord.getText().toCharArray());
}
else
{
throw new UnsupportedCallbackException
(callbacks[i], "Unrecognized Callback");
}
}
}