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
,使其指向新的位置。