Browse Source

DEC-7216 kerberos登录失败的问题

release/10.0
rinoux 6 years ago
parent
commit
bf054a2ee7
  1. 2
      plugin.xml
  2. 17
      src/main/java/com/fr/plugin/hdfs/repository/core/HDFSRepositoryFactory.java

2
plugin.xml

@ -4,7 +4,7 @@
<name><![CDATA[HDFS资源仓库]]></name>
<active>yes</active>
<hidden>no</hidden>
<version>1.3</version>
<version>1.4</version>
<env-version>10.0</env-version>
<jartime>2018-12-27</jartime>
<vendor>rinoux</vendor>

17
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<HDFSConfig> {
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<HDFSConfig> {
//类似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 {

Loading…
Cancel
Save