docs: @Override
      @FFDCIgnore({ AuthenticationException.class, IllegalArgumentException.class, WSLoginFailedException.class })
      public boolean login() throws LoginException {
          if (isAlreadyProcessed()) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Already processed by other login module, abstaining.");
              }
              return false;
          }
  
          try {
              Callback[] callbacks = getRequiredCallbacks(callbackHandler);
              String user = ((NameCallback) callbacks[0]).getName();
              char[] passwordChars = ((PasswordCallback) callbacks[1]).getPassword();
  
              // If we have insufficient data, abstain.
              if (user == null || passwordChars == null) {
                  return false;
              }
  
              if (user.trim().isEmpty()) {
                  return false;
              }
  
              setAlreadyProcessed();
  
              userRegistry = getUserRegistry();
              urAuthenticatedId = userRegistry.checkPassword(user, String.valueOf(passwordChars));
              if (urAuthenticatedId != null) {
                  username = getSecurityName(user, urAuthenticatedId);
                  setUpTemporarySubject();
                  updateSharedState();
                  return true;
              } else {
                  Tr.audit(tc, "JAAS_AUTHENTICATION_FAILED_BADUSERPWD", user);
                  throw new AuthenticationException(TraceNLS.getFormattedMessage(this.getClass(),
                                                                                 TraceConstants.MESSAGE_BUNDLE,
                                                                                 "JAAS_AUTHENTICATION_FAILED_BADUSERPWD",
                                                                                 new Object[] { user },
                                                                                 "CWWKS1100A: Authentication failed for the userid {0}. A bad userid and/or password was specified."));
              }
          } 
          catch (com.ibm.ws.security.registry.PasswordExpiredException e) {
              throw new PasswordExpiredException(e.getLocalizedMessage(), e);
          } catch (com.ibm.ws.security.registry.UserRevokedException e) {
              throw new UserRevokedException(e.getLocalizedMessage(), e);
          } 
          catch (AuthenticationException e) {
  
              // NO FFDC: AuthenticationExceptions are expected (bad userid/password is pretty normal)
              throw e; // no-need to wrap
          } catch (IllegalArgumentException e) {
              // NO FFDC: This is normal when user and/or password are blank/null
              throw new AuthenticationException(e.getLocalizedMessage(), e);
          } catch (WSLoginFailedException e) {
              // NO FFDC: This is normal when user and/or password are blank/null
              throw new AuthenticationException(e.getLocalizedMessage(), e);
          } catch (LoginException e) {
              throw new AuthenticationException(e.getLocalizedMessage(), e);
          } catch (Exception e) {
              // This is not normal: FFDC will be instrumented
              throw new AuthenticationException(e.getLocalizedMessage(), e);
          }
      }