Wei-Chiu Chuang created HADOOP-14327:
----------------------------------------

             Summary: KerberosAuthenticationHandler#authenticate throws 
meaningless exception with empty server principals
                 Key: HADOOP-14327
                 URL: https://issues.apache.org/jira/browse/HADOOP-14327
             Project: Hadoop Common
          Issue Type: Bug
          Components: security
    Affects Versions: 3.0.0-alpha2
            Reporter: Wei-Chiu Chuang
            Priority: Minor


If somehow KerberosAuthenticationHandler#authenticate gets an empty service 
principal set, it throws a useless exception like the following:

{noformat}
2017-04-19 10:11:39,812 DEBUG 
org.apache.hadoop.security.authentication.server.AuthenticationFilter: 
Authentication exception: 
org.apache.hadoop.security.authentication.client.AuthenticationExceptio
n
org.apache.hadoop.security.authentication.client.AuthenticationException: 
org.apache.hadoop.security.authentication.client.AuthenticationException
        at 
org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler.authenticate(KerberosAuthenticationHandler.java:452)
        at 
org.apache.hadoop.security.authentication.server.MultiSchemeAuthenticationHandler.authenticate(MultiSchemeAuthenticationHandler.java:193)
        at 
org.apache.hadoop.security.token.delegation.web.DelegationTokenAuthenticationHandler.authenticate(DelegationTokenAuthenticationHandler.java:400)
        at 
org.apache.hadoop.security.token.delegation.web.MultiSchemeDelegationTokenAuthenticationHandler.authenticate(MultiSchemeDelegationTokenAuthenticationHandler.java:180)
        at 
org.apache.solr.security.RequestContinuesRecorderAuthenticationHandler.authenticate(RequestContinuesRecorderAuthenticationHandler.java:69)
        at 
org.apache.hadoop.security.authentication.server.AuthenticationFilter.doFilter(AuthenticationFilter.java:532)
{noformat}

The following code has a logic error. If serverPrincipals is empty, token 
remains null in the end, but lastException is also null too, so throwing it is 
meaningless. It should throw with a more meaningful message.
{code:title=KerberosAuthenticationHandler#authenticate}
                AuthenticationToken token = null;
                Exception lastException = null;
                for (String serverPrincipal : serverPrincipals) {
                  try {
                    token = runWithPrincipal(serverPrincipal, clientToken,
                        base64, response);
                  } catch (Exception ex) {
                    lastException = ex;
                    LOG.trace("Auth {} failed with {}", serverPrincipal, ex);
                  } finally {
                      if (token != null) {
                        LOG.trace("Auth {} successfully", serverPrincipal);
                        break;
                    }
                  }
                }
                if (token != null) {
                  return token;
                } else {
                  throw new AuthenticationException(lastException);
                }
{code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

---------------------------------------------------------------------
To unsubscribe, e-mail: common-dev-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-dev-h...@hadoop.apache.org

Reply via email to