java - 使用凭据缓存的 Kerberos 身份验证通过 Eclipse 工作,但不能通过命令行工作

标签 java eclipse hadoop kerberos

描述:我构建了一个应用程序,它从应用了 Kerberos 身份验证的远程集群中获取 HDFS(Hadoop 分布式文件系统)文件。我可以从 Eclipse 执行 HDFS.copyToLocalFile(path1, path2) 并且它工作正常。但是当我将项目导出为可运行的 jar 并尝试通过命令行运行它时,它会抛出以下错误。注意:我已按照@ https://sourceforge.net/p/jsch/mailman/message/26939797/ 中提到的步骤进行操作并成功地从 Eclipse 运行该项目。我已经检查了 Eclipse 中的其他文件,但找不到任何文件。我安装了 Kerberos V5 MIT 和 Network Identity Manager(4.0 版)

Caused by: java.io.IOException: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]
at org.apache.hadoop.ipc.Client$Connection$1.run(Client.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Unknown Source)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
at org.apache.hadoop.ipc.Client$Connection.handleSaslConnectionFailure(Client.java:643)
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:730)
at org.apache.hadoop.ipc.Client$Connection.access$2800(Client.java:368)
at org.apache.hadoop.ipc.Client.getConnection(Client.java:1521)
at org.apache.hadoop.ipc.Client.call(Client.java:1438)
... 70 more
Caused by: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]
at org.apache.hadoop.security.SaslRpcClient.selectSaslClient(SaslRpcClient.java:172)
at org.apache.hadoop.security.SaslRpcClient.saslConnect(SaslRpcClient.java:396)
at org.apache.hadoop.ipc.Client$Connection.setupSaslConnection(Client.java:553)
at org.apache.hadoop.ipc.Client$Connection.access$1800(Client.java:368)
at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:722)
at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:718)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Unknown Source)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:717)
... 73 more

注意:我已经将eclipsed的相关参数配置到一个Configuration.xml中,并绑定(bind)到classpath中。

<property>
    <name>java.security.auth.login.config</name>
    <value>./Configuration/login.conf</value>
</property>
<property>
    <name>java.security.krb5.conf</name>
    <value>./Configuration/krb5.conf</value>
</property>
<property>
    <name>javax.security.auth.useSubjectCredsOnly</name>
    <value>false</value>
</property>

最佳答案

我认为 Kerberos 身份验证失败,因为在使用 JAR 时无法在运行时找到您的 login.confkrb5.conf 文件。

当我尝试从 JAR 文件访问 assets 文件夹中的文件时,我遇到了类似的问题。关键是,当将包导出为 JAR 时,路径会以某种方式发生变化。您是否有机会以某种方式检查代码中的文件路径,例如

String resourceFile = YourClass.class.getResource("/krb5.conf").getFile();
// check if resourceFile is null!

如果此 class.getResource(...) 命令可以通过 IDE 运行,但不会在您的 JAR 中运行,则问题在于文件位置的差异。

我认为这篇文章可以帮助您:How to get a path to a resource in a Java JAR file

关于java - 使用凭据缓存的 Kerberos 身份验证通过 Eclipse 工作,但不能通过命令行工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42136518/

相关文章:

java - 查询性能不佳,选择少量字段比选择大量字段慢 10 倍

java - 我的 .java 文件是否必须与 JDK 位于同一硬盘驱动器上?如果不是,为什么 CMD 返回 java.lang.ClassNotFoundException?

python - 使用 Eclipse/Pydev 记录 python

c++ - Android C++ native 代码

r - 具有多个组件的RHadoop key

java - 骰子游戏

java - 使用 <foreach> 时的 "failed to create task or type foreach"故障排除

eclipse - 如何将参数/开关添加到Eclipse/Maven Run Configuration

hadoop - MapReduce 旧 API - 将命令行参数传递给 map

hadoop - 如何通过流式加速对 HDFS 中数据的探索?