几周以来,我正在研究一个cloudera集群,它使用了kerberos身份验证功能。
Wildfly服务器需要连接到这个cloudera集群,因为它需要执行一些impala查询,这是通过wildfly数据源完成的。
现在,我的问题是:向此impala数据源添加kerberos身份验证机制的最佳方法是什么?
我尝试将连接网址更改为somethinng
jdbc:impala://XXXXXXX:21050/impala?AuthMech=1;KrbRealm=AAA.BBB.CC;KrbHostFQDN=my-proxy;KrbServiceName=impala;LogLevel=6;LogPath=/tmp/
(我检查了客户隐私)
然后我像这样将新的安全域传递给了impala数据源
<security>
<security-domain>security-impala</security-domain>
</security>
此类安全域声明如下:
<security-domain name="security-impala" cache-type="default">
<authentication>
<login-module code="org.jboss.security.negotiation.KerberosLoginModule" flag="required" module="org.jboss.security.negotiation">
<module-option name="useKeyTab" value="true"/>
<module-option name="keyTab" value="/path/to/my.keytab"/>
<module-option name="principal" value="principal@REALM.COM"/>
<module-option name="useTicketCache" value="false"/>
<module-option name="debug" value="true"/>
<module-option name="refreshKrb5Config" value="true"/>
<module-option name="isInitiator" value="true"/>
<module-option name="doNotPrompt" value="true"/>
</login-module>
</authentication>
</security-domain>
我还尝试使用配置单元jdbc驱动程序,并使用看起来像这样的代码直接从Java代码直接执行操作(不使用数据源):
UserGroupInformation ugi =
UserGroupInformation.loginUserFromKeytabAndReturnUGI(user, keytabfile);
Connection con = (Connection) ugi.doAs(new
PrivilegedExceptionAction<Object>() {
public Object run() {
Connection tcon = null;
try {
tcon = DriverManager.getConnection(connectionURL, user,
passwd);
} catch (SQLException e) {}
return tcon;
}
});
如果创建一个jar文件,该文件可以正常工作,我可以在其中手动导入所有需要的依赖项。
问题是我并不是真的想要这个解决方案,因为我将不得不使wildfly中的其他WAR使用此JAR文件作为一个独立的过程,这效率很低。另外,当我尝试将代码集成到WAR中时,当我包含WAR时,似乎总是缺少一些Maven依赖 hive-jdbc,2.0.0依赖于pom文件