docker kerberos webhdfs AuthenticationException:未经授权

我有一个spring的应用程序。 其中一种方法是使用webhdfs从hdfs中读取一个文件。 当我在想法testing它,它的工作。 但是,在我构build项目并在虚拟机本地或在连接到hdfs的服务器上部署Docker镜像后,我就可以看到。

AuthenticationException: Unauthorized 

在我的本地机器上,我必须定期初始化令牌

 kinit 

用于听力。 如果我不这样做,我会得到同样的错误。 我testing了没有docker在服务器上的应用程序,它也可以。 我认为,docker形象没有看到令牌。 但是我不知道该怎么办。

Kerberos用于安全性。

有什么build议?

奥基。 我做的。 有几个问题,但这是最终变种的样子。

我的docker工人 krb5.conf和keytab与我的docker文件在同一个文件夹中。 当我build立项目,他们被添加到容器,并在我使用的入口点

 -Djava.security.krb5.conf 

提供krb5位置。 还有一些选项用于debugging+我连接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; } 

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