我正在尝试通过sqlContext.read.format("json")方法连接到Oracle。一切都很好,但是在创建JDBC字符串时,我必须在字符串中指定数据库的用户名和密码:

val jdbcString = "jdbc:oracle:thin:USERNAME/PASSWORD@//HOSTNAME:PORT/SID"

但是,我确实在HDFS上有一个jceks文件,其中包含密码。我想知道是否有什么方法可以利用该文件而不是纯文本密码来连接JDBC?像在Sqoop中一样,我们可以做到:
sqoop import -Dhadoop.security.credential.provider.path=jceks://hdfs/data/credentials/oracle.password.jceks

谢谢。

最佳答案

这是使用CredentialProviderFactory实现的。

import org.apache.hadoop.security.alias.CredentialProviderFactory

val conf = new org.apache.hadoop.conf.Configuration()
val alias = "password.alias"
val jceksPath = "jceks://hdfs/user/data/alias/MySQL.password.jceks"

conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, jceksPath)

//getPassword Returns Array[Char]
val password = conf.getPassword(alias).mkString

09-11 02:08