您可以使用以下代码段替换SpringBoot / Tomcat提供的默认连接池.它将每10分钟刷新一次令牌密码,因为令牌有效期为15分钟.此外,它假定可以从DNS主机名中提取区域.如果不是这种情况,则需要指定要使用的区域.

public class RdsIamAuthDataSource extends org.apache.tomcat.jdbc.pool.DataSource {

private static final Logger LOG = LoggerFactory.getLogger(RdsIamAuthDataSource.class);

/**

* The Java KeyStore (JKS) file that contains the Amazon root CAs

*/

public static final String RDS_CACERTS = "/rds-cacerts";

/**

* Password for the ca-certs file.

*/

public static final String PASSWORD = "changeit";

public static final int DEFAULT_PORT = 3306;

@Override

public ConnectionPool createPool() throws SQLException {

return pool != null ? pool : createPoolImpl();

}

protected synchronized ConnectionPool createPoolImpl() throws SQLException {

return pool = new RdsIamAuthConnectionPool(poolProperties);

}

public static class RdsIamAuthConnectionPool extends ConnectionPool implements Runnable {

private RdsIamAuthTokenGenerator rdsIamAuthTokenGenerator;

private String host;

private String region;

private int port;

private String username;

private Thread tokenThread;

public RdsIamAuthConnectionPool(PoolConfiguration prop) throws SQLException {

super(prop);

}

@Override

protected void init(PoolConfiguration prop) throws SQLException {

try {

URI uri = new URI(prop.getUrl().substring(5));

this.host = uri.getHost();

this.port = uri.getPort();

if (this.port < 0) {

this.port = DEFAULT_PORT;

}

this.region = StringUtils.split(this.host,'.')[2]; // extract region from rds hostname

this.username = prop.getUsername();

this.rdsIamAuthTokenGenerator = RdsIamAuthTokenGenerator.builder().credentials(new DefaultAWSCredentialsProviderChain()).region(this.region).build();

updatePassword(prop);

final Properties props = prop.getDbProperties();

props.setProperty("useSSL","true");

props.setProperty("requireSSL","true");

props.setProperty("trustCertificateKeyStoreUrl",getClass().getResource(RDS_CACERTS).toString());

props.setProperty("trustCertificateKeyStorePassword", PASSWORD);

super.init(prop);

this.tokenThread = new Thread(this, "RdsIamAuthDataSourceTokenThread");

this.tokenThread.setDaemon(true);

this.tokenThread.start();

} catch (URISyntaxException e) {

throw new RuntimeException(e.getMessage());

}

}

@Override

public void run() {

try {

while (this.tokenThread != null) {

Thread.sleep(10 * 60 * 1000); // wait for 10 minutes, then recreate the token

updatePassword(getPoolProperties());

}

} catch (InterruptedException e) {

LOG.debug("Background token thread interrupted");

}

}

@Override

protected void close(boolean force) {

super.close(force);

Thread t = tokenThread;

tokenThread = null;

if (t != null) {

t.interrupt();

}

}

private void updatePassword(PoolConfiguration props) {

String token = rdsIamAuthTokenGenerator.getAuthToken(GetIamAuthTokenRequest.builder().hostname(host).port(port).userName(this.username).build());

LOG.debug("Updated IAM token for connection pool");

props.setPassword(token);

}

}

}

请注意,您需要导入Amazon的根/中间证书才能建立可信连接.上面的示例代码假定证书已导入到名为“rds-cacert”的文件中,并且在类路径中可用.或者,您也可以将它们导入JVM的“cacerts”文件中.

要使用此数据源,可以使用Spring的以下属性:

datasource:

url: jdbc:mysql://dbhost.xyz123abc.us-east-1.rds.amazonaws.com/dbname

username: iam_app_user

driver-class-name: com.mysql.cj.jdbc.Driver

type: com.mydomain.jdbc.RdsIamAuthDataSource

使用Spring Java配置:

@Bean public DataSource dataSource() {

PoolConfiguration props = new PoolProperties();

props.setUrl("jdbc:mysql://dbname.abc123xyz.us-east-1.rds.amazonaws.com/dbschema");

props.setUsername("iam_dbuser_app");

props.setDriverClassName("com.mysql.jdbc.Driver");

return new RdsIamAuthDataSource(props);

}

java aws访问授权 实例_java – 使用IAM身份验证和Spring JDBC访问AWS ...相关推荐

  1. java ldap操作实例_Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法...

    java ldap操作实例 LDAP身份验证是世界上最流行的企业应用程序身份验证机制之一,而Active Directory (Microsoft为Windows提供的LDAP实现)是另一种广泛使用的 ...

  2. java实现iam登录认证_是否可以通过Cloudfront对API网关进行IAM身份验证?

    是否可以通过Cloudfront将IAM角色身份验证用于API网关 endpoints ? 这是一个基本用例: / api - > API网关 / * - > S3 HTML / Java ...

  3. iam身份验证以及访问控制_如何将受限访问IAM用户添加到EKS群集

    iam身份验证以及访问控制 介绍 (Introduction) Elastic Kubernetes Service (EKS) is the fully managed Kubernetes ser ...

  4. IAM(身份验证以及访问控制)

    1.简述 IAM(IDENTITY & ACCESS MANAGEMENT),身份验证以及访问控制,一种对资源提供可控安全的访问解决方案,现在的公有云基本都支持IAM来对公有云资源提供授权访问 ...

  5. hbase java 端口_HBase远程Java客户端尝试通过随机端口进行身份验证

    我想将本地java/scala进程连接到远程HBase服务器(v 1.1.2)(在docker中).我有以下代码:HBase远程Java客户端尝试通过随机端口进行身份验证 val config = H ...

  6. Http基本身份验证在Spring Security中如何工作?

    在上一篇文章中,您学习了如何在基于Spring安全性的Java应用程序中启用Http基本身份验证 ,现在,我们将进一步进一步了解http基本身份验证在Spring安全性中的工作原理. 如果您还记得的话 ...

  7. 使用API​​身份验证的Spring Security

    背景 尽管有许多博客文章详细介绍了如何使用Spring Security,但是当问题域位于标准LDAP或数据库身份验证之外时,我仍然经常发现配置挑战. 在本文中,我将介绍一些针对Spring Secu ...

  8. java反射创建实例_Java反射创建实例

    Java反射创建实例 package com.wkcto.chapter08.demo02; import java.lang.reflect.Constructor; import java.lan ...

  9. java邮件程序实例_java 发送邮件简单实例

    全部代码: EmailAuthenticator.java package com.gjw.test; import javax.mail.Authenticator; import javax.ma ...

最新文章

  1. [干货]我如何考察面试者的机器学习水平
  2. 英特尔双倍功耗换性能,放话12代酷睿i9超越M1 Max,网友:可以煎鸡蛋了?
  3. python实现数据库事务回滚_使用Python脚本实现MySQL误操作的快速回滚
  4. 崛企问卷调查小程序模块V1.3.2
  5. 南通大学教务管理微信体验
  6. Cartopy 中的地图投影
  7. Control-车辆动力学模型
  8. 要求:弹出框接收字符串输入 输入aaabbbcccddd 输出3a3b3c3d
  9. web——216中安全色
  10. 【白板动画制作软件】万彩手影大师教程 | 调节动作播放时长
  11. 使用豆瓣音乐API笔记
  12. 周迅与李大齐分手后首谈旧爱:诚实面对自己的想法
  13. 美国交通事故分析(2017)(项目练习_5)
  14. java中的Dao类,model类是什么意思
  15. vue 海康视频播放
  16. IDEA中把springboot项目中工具类打成jar包,其他项目进行依赖引用
  17. 蓝桥杯练习系统[C++]
  18. 改变世界的17个方程式
  19. 「面试必背」Spring Cloud面试题(2022最新版)
  20. (附源码)springboot课程评价系统 毕业设计 211004

热门文章

  1. 计算机组成原理中的“上溢”和“下溢”分别的定义是什么?
  2. 探索 TVM 进行量化方法
  3. HarmonyOS技术特性
  4. 2019个嵌入式市场研究,持续的C/C++优势
  5. Android 删除无用的导包
  6. jquery 监听的案例
  7. Android studio 自动导入(全部)包 import
  8. 浅析 JavaScript 中的 函数 uncurrying 反柯里化
  9. Gradle安装使用以及基本操作
  10. 2022-2028年中国电子签名行业深度调研及投资前景预测报告