Как мне настроить это так, чтобы приведенный ниже метод входа принимал входные данные из 2 полей JTextField?

#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");
     }
 }
 }