Evg*_*nii 5 spring kerberos hdfs docker webhdfs
我有一个 Spring 应用程序,它使用 WebHDFS 从 HDFS 读取文件。当我在 IDEA 中测试它时,它可以工作。但是在我构建项目并在本地虚拟机或连接到 HDFS 的服务器上部署 Docker 映像后,我得到:
AuthenticationException: Unauthorized
Run Code Online (Sandbox Code Playgroud)
在我的本地机器上,我必须定期初始化令牌
kinit
Run Code Online (Sandbox Code Playgroud)
用于认证。如果我不这样做,我会得到同样的错误。我在服务器上测试了没有 Docker 的应用程序,它也可以工作。我认为 Docker 映像没有看到令牌。但我不知道该怎么办。
Kerberos 用于安全。
有什么建议吗?
好的。我做到了。虽然存在一些问题,但这就是最终版本的样子。
我的码头工人 krb5.conf 和 keytab 与我的 docker 文件位于同一文件夹中。当我构建项目时,它们被添加到容器和我使用的入口点中
-Djava.security.krb5.conf
Run Code Online (Sandbox Code Playgroud)
提供 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"]
Run Code Online (Sandbox Code Playgroud)
然后我用它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;
}
Run Code Online (Sandbox Code Playgroud)
如果你想在没有 docker 的情况下运行应用程序,只需构建它并将 keytab 添加到与 jar 相同的方向即可。然后进行更改,/etc/evkuzmin.keytab使其指向新位置。
| 归档时间: |
|
| 查看次数: |
3685 次 |
| 最近记录: |