Docker Kerberos WebHDFS AuthenticationException:未经授权

时间:2017-08-30 11:57:34

标签: spring docker hdfs kerberos webhdfs

我有一个Spring应用程序,它使用WebHDFS从HDFS读取文件。当我在IDEA中测试时,它可以工作。但是在我构建项目并在本地或连接到HDFS的服务器上的虚拟机上部署Docker镜像后,我得到:

AuthenticationException: Unauthorized

在我的本地机器上,我必须定期用

初始化令牌
kinit

用于身份验证。如果我不这样做,我会得到同样的错误。我在服务器上测试了没有Docker的应用程序,它也有效。我认为Docker镜像看不到令牌。但我不知道该怎么做。

Kerberos用于安全。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

奥基。我做的。存在一些问题,但这是最终变体的外观。

我的码头工人。 krb5.conf和keytab与我的docker文件位于同一文件夹中。当我构建项目时,它们被添加到容器中,并在入口点中使用

-Djava.security.krb5.conf

提供krb5位置。还有一些调试选项+我连接mongo。

FROM java:8
ADD report.jar report.jar
ADD krb5.conf /etc/krb5.conf
ADD evkuzmin.keytab /etc/evkuzmin.keytab
RUN sh -c 'touch report.jar'
ENTRYPOINT ["java","-Dspring.data.mongodb.uri=mongodb://audpro_mongo/report","-Djavax.net.debug=all","-Dsun.security.spnego.debug=true","-Dsun.security.krb5.debug=true","-Djava.security.krb5.conf=/etc/krb5.conf","-jar","/report.jar"]

然后我使用KerberosRestTemplate连接到webhdfs

public String getReportJSON() throws URISyntaxException {
    KerberosRestTemplate restTemplate = new 
         KerberosRestTemplate("/etc/evkuzmin.keytab", "EvKuzmin@DOMAIN");
    URI uri = new URI("http" + "://" + host + ":" + port + "/webhdfs/v1" + path + "?op=OPEN");
    String json = restTemplate.getForObject(uri, String.class);
    return json;
  }

如果您想在没有泊坞窗的情况下运行应用程序,只需构建它并将密钥表添加到与jar相同的方向。然后更改/etc/evkuzmin.keytab,使其指向新位置。