Skip to content

Commit

Permalink
HADOOP-13558. UserGroupInformation created from a Subject incorrectly…
Browse files Browse the repository at this point in the history
… tries to renew the Kerberos ticket. Contributed by Xiao Chen.

(cherry picked from commit 680be58)
  • Loading branch information
xiao-chen committed Sep 7, 2016
1 parent f9415b7 commit d157733
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 3 deletions.
Expand Up @@ -620,9 +620,24 @@ private void setLogin(LoginContext login) {
* @param subject the user's subject
*/
UserGroupInformation(Subject subject) {
this(subject, false);
}

/**
* Create a UGI from the given subject.
* @param subject the subject
* @param externalKeyTab if the subject's keytab is managed by the user.
* Setting this to true will prevent UGI from attempting
* to login the keytab, or to renew it.
*/
private UserGroupInformation(Subject subject, final boolean externalKeyTab) {
this.subject = subject;
this.user = subject.getPrincipals(User.class).iterator().next();
this.isKeytab = KerberosUtil.hasKerberosKeyTab(subject);
if (externalKeyTab) {
this.isKeytab = false;
} else {
this.isKeytab = KerberosUtil.hasKerberosKeyTab(subject);
}
this.isKrbTkt = KerberosUtil.hasKerberosTicket(subject);
}

Expand Down Expand Up @@ -838,10 +853,11 @@ static void loginUserFromSubject(Subject subject) throws IOException {
newLoginContext(authenticationMethod.getLoginAppName(),
subject, new HadoopConfiguration());
login.login();
UserGroupInformation realUser = new UserGroupInformation(subject);
LOG.debug("Assuming keytab is managed externally since logged in from"
+ " subject.");
UserGroupInformation realUser = new UserGroupInformation(subject, true);
realUser.setLogin(login);
realUser.setAuthenticationMethod(authenticationMethod);
realUser = new UserGroupInformation(login.getSubject());
// If the HADOOP_PROXY_USER environment variable or property
// is specified, create a proxy user as the logged in user.
String proxyUser = System.getenv(HADOOP_PROXY_USER);
Expand Down
Expand Up @@ -32,6 +32,7 @@

import javax.security.auth.Subject;
import javax.security.auth.kerberos.KerberosPrincipal;
import javax.security.auth.kerberos.KeyTab;
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.LoginContext;

Expand Down Expand Up @@ -976,4 +977,27 @@ public void testExternalTokenFiles() throws Exception {
assertTrue(credsugiTokens.contains(token1));
assertTrue(credsugiTokens.contains(token2));
}

@Test
public void testCheckTGTAfterLoginFromSubject() throws Exception {
// security on, default is remove default realm
SecurityUtil.setAuthenticationMethod(AuthenticationMethod.KERBEROS, conf);
UserGroupInformation.setConfiguration(conf);

// Login from a pre-set subject with a keytab
final Subject subject = new Subject();
KeyTab keytab = KeyTab.getInstance();
subject.getPrivateCredentials().add(keytab);
UserGroupInformation ugi = UserGroupInformation.getCurrentUser();
ugi.doAs(new PrivilegedExceptionAction<Void>() {
@Override
public Void run() throws IOException {
UserGroupInformation.loginUserFromSubject(subject);
// this should not throw.
UserGroupInformation.getLoginUser().checkTGTAndReloginFromKeytab();
return null;
}
});

}
}

0 comments on commit d157733

Please sign in to comment.