spring - Docker Kerberos WebHDFS 身份验证异常 : Unauthorized

标签 spring docker hdfs kerberos webhdfs

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

AuthenticationException: Unauthorized

在我的本地计算机上,我必须定期初始化 token

kinit

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

Kerberos 用于安全。

有什么建议吗?

最佳答案

好的。我做到了。虽然存在一些问题,但这就是最终变体的样子。

我的 docker 。 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;
  }

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

关于spring - Docker Kerberos WebHDFS 身份验证异常 : Unauthorized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45959815/

相关文章:

java - 使用 AbstractAnnotationConfigDispatcherServletInitializer 处理两个调度程序 Servlet

spring - SimpleUrlHandlerMapping 不适用于带有少量扩展名(如 dsm 或 ds)的 url

hadoop - "dfs.replication"和 "dfs.datanode.data.dir"配置如何在集群中工作?

java - 我们如何指定用于身份验证的方法?

java - 如何禁用某一特定 Spring AOP 方面?

docker - 将 Gcloud 与 Vagrant 一起使用

docker - Nextflow配置文件问题

spring - 我可以在 Windows 上构建镜像并在 Linux 上运行容器吗?

hadoop - 如何在 hadoop 中向公众公开任务跟踪器/工作跟踪器 web 界面?

java - 将目录从本地系统复制到hdfs java代码