如何使用 Spring-JPA 将 Oracle JDBC 设置为使用外部身份验证?

How do I set Oracle JDBC to use external authentication using Spring-JPA?

我目前有一个简单的节点应用程序,它与 Oracle 数据库通信并使用 Kerberos 进行身份验证。工作代码如下所示...

oracledb.externalAuth = true;
oracledb.autoCommit = true;
...
get poolConnection(){
    return oracledb.createPool({
        connectString: this.connectionString
    });
}

注意我不需要用户名和密码。我尝试使用 Spring-JPA 在 Scala 中做同样的事情。我的配置看起来像这样...

spring:
  datasource:
    url: jdbc:oracle:thin:@//myjdbcurl
    validationQuery: SELECT 1
  jpa:
    show-sql: true
    properties:
      hibernate:
        dialect=org:
          hibernate:
            dialect:
              Oracle10gDialect: org.hibernate.dialect.Oracle10gDialect

还有像这样的 POM...

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.1.0</version>
</dependency>

然而,当我尝试 运行 我得到...

ORA-28040: No matching authentication protocol

如何使用 Oracle 和 Spring-JPA 处理 Kerberos Auth?

所以在我的例子中,为了让它工作,我的 application.yml 看起来像这样......

spring:
  datasource:
    url: jdbc:oracle:thin:@//...
    validationQuery: select 1 from dual
  jpa:
    show-sql: true
    properties:
      hibernate:
        naming:
          implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
          physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
        dialect: org.hibernate.dialect.Oracle10gDialect
jdbc:
  url: jdbc:oracle:thin:@//...
  driver:
    class:
      name: oracle.jdbc.OracleDrive

我不得不将其添加到设置 Spring 应用程序的静态主程序中...

def main(args: Array[String]) : Unit = {
    System.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICES, "KERBEROS5")
    System.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_KRB5_MUTUAL, "true")
    System.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_KRB5_CC_NAME, System.getenv("KRB5CCNAME"))
    System.setProperty("java.security.krb5.conf", System.getenv("KRB5_CONFIG"))
    SpringApplication.run(classOf[Application], args :_ *)
  }

我在查看代码后尝试将其添加到属性中,但只有上面的方法有效。

#java:
#  security:
#    krb5:
#      conf: ${KRB5_CONFIG}
#oracle:
#  net:
#    authentication_services: "KERBEROS5"
#    kerberos5_mutual_authentication: "true"
#    kerberos5_cc_name: ${KRB5_CONFIG}