docs: @Override
      public synchronized void authenticate() throws PortalSecurityException {
          int i;
          Enumeration e = mySubContexts.elements();
  
          while (e.hasMoreElements()) {
              ISecurityContext sctx = ((Entry) e.nextElement()).getCtx();
              // The principal and credential are now set for all subcontexts in Authentication
              try {
                  if (sctx instanceof IParentAwareSecurityContext) {
                      ((IParentAwareSecurityContext) sctx).authenticate(this);
                  } else {
                      sctx.authenticate();
                  }
              } catch (Exception ex) {
                  log.error("Exception authenticating subcontext " + sctx, ex);
              }
              // Stop attempting to authenticate if authenticated and if the property flag is set
              if (stopWhenAuthenticated && sctx.isAuthenticated()) {
                  break;
              }
          }
  
          // Zero out the actual credentials if it isn't already null
          if (this.myOpaqueCredentials.credentialstring != null) {
              for (i = 0; i < this.myOpaqueCredentials.credentialstring.length; i++)
                  this.myOpaqueCredentials.credentialstring[i] = 0;
              myOpaqueCredentials.credentialstring = null;
          }
  
          return;
      }