diff --git a/plugin.xml b/plugin.xml index 8d02872..7954572 100644 --- a/plugin.xml +++ b/plugin.xml @@ -4,7 +4,7 @@ yes no - 1.3 + 1.4 10.0 2018-12-27 rinoux diff --git a/src/main/java/com/fr/plugin/hdfs/repository/core/HDFSRepositoryFactory.java b/src/main/java/com/fr/plugin/hdfs/repository/core/HDFSRepositoryFactory.java index 0ad320f..bd99022 100644 --- a/src/main/java/com/fr/plugin/hdfs/repository/core/HDFSRepositoryFactory.java +++ b/src/main/java/com/fr/plugin/hdfs/repository/core/HDFSRepositoryFactory.java @@ -18,8 +18,11 @@ import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.security.AnnotatedSecurityInfo; import org.apache.hadoop.security.SecurityUtil; import org.apache.hadoop.security.UserGroupInformation; +import org.apache.hadoop.security.authentication.util.KerberosName; +import org.apache.hadoop.security.authentication.util.KerberosUtil; import java.io.IOException; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URI; @@ -86,11 +89,12 @@ public class HDFSRepositoryFactory extends ConfigRepositoryFactory { String hdfsUrl = HDFS_SCHEMA.concat(host).concat(":").concat(port); String principal = config.getPrincipal(); String krb5Conf = config.getKrbConf(); + String keyTab = config.getKeyTab(); FineLoggerFactory.getLogger().debug("[HDFS REPOSITORY] Host:{}", host); FineLoggerFactory.getLogger().debug("[HDFS REPOSITORY] Port:{}", port); FineLoggerFactory.getLogger().debug("[HDFS REPOSITORY] Principal:{}", principal); - FineLoggerFactory.getLogger().debug("[HDFS REPOSITORY] KeyTab:{}", config.getKeyTab()); + FineLoggerFactory.getLogger().debug("[HDFS REPOSITORY] KeyTab:{}", keyTab); FineLoggerFactory.getLogger().debug("[HDFS REPOSITORY] krb5.conf:{}", krb5Conf); @@ -108,9 +112,16 @@ public class HDFSRepositoryFactory extends ConfigRepositoryFactory { //类似OSGI下,类加载需要设置SecurityUtil.setSecurityInfoProviders(new AnnotatedSecurityInfo()); //refer to https://stackoverflow.com/questions/37608049/how-to-connect-with-hdfs-via-kerberos-from-osgi-bundles SecurityUtil.setSecurityInfoProviders(new AnnotatedSecurityInfo()); - //UserGroupInformation初始化 + + //重置defaultRealm,hadoop2.7以前没有提供resetDefaultRealm方法,需要反射设置一下这个变量,否则无法登录 + Field field = KerberosName.class.getDeclaredField("defaultRealm"); + assert field != null; + field.setAccessible(true); + field.set(KerberosName.class, KerberosUtil.getDefaultRealm()); + + //UserGroupInformation初始化和登录验证 UserGroupInformation.setConfiguration(conf); - UserGroupInformation.loginUserFromKeytab(principal, config.getKeyTab()); + UserGroupInformation.loginUserFromKeytab(principal, keyTab); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } finally {