You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Quarkus Hibernate实现RDS基于IAM的身份认证?

解决RDS Aurora Postgres IAM身份认证适配(Quarkus + Kotlin + Hibernate Panache)

基于Hibernate的无重构变通方案

可以通过自定义DataSource结合Quarkus定时任务实现,无需改动Hibernate Panache的核心使用逻辑:

  1. 自定义DataSource动态生成IAM令牌
    实现一个DataSource包装类,每次获取连接时生成最新的IAM认证令牌(通过AWS SDK生成),并以此作为密码建立连接:
class IamAuthDataSource(private val tokenCache: IamTokenCache) : DataSource {
    private val basicDs = HikariDataSource().apply {
        jdbcUrl = System.getenv("QUARKUS_DATASOURCE_JDBC_URL")
        driverClassName = "org.postgresql.Driver"
    }

    override fun getConnection(): Connection {
        val token = tokenCache.getValidToken()
        val user = "你的IAM认证用户名"
        return DriverManager.getConnection(basicDs.jdbcUrl, user, token)
    }

    // 实现DataSource接口其他方法,直接委托给basicDs
    override fun getConnection(username: String?, password: String?): Connection = basicDs.getConnection(username, password)
    override fun unwrap<T>(iface: Class<T>?): T = basicDs.unwrap(iface)
    override fun isWrapperFor(iface: Class<T>?): Boolean = basicDs.isWrapperFor(iface)
    override fun getLoginTimeout(): Int = basicDs.loginTimeout
    override fun setLoginTimeout(seconds: Int) = basicDs.setLoginTimeout(seconds)
    override fun getLogWriter(): PrintWriter = basicDs.logWriter
    override fun setLogWriter(out: PrintWriter?) = basicDs.setLogWriter(out)
}
  1. 添加令牌缓存与定时刷新
    用Quarkus的@Scheduled定时预先生成令牌,避免每次建立连接都调用AWS API:
@ApplicationScoped
class IamTokenCache {
    private var cachedToken: String = ""
    private var expiryTime: Instant = Instant.MIN

    @Scheduled(every = "14m") // 提前1分钟刷新,令牌默认有效期15分钟
    fun refreshToken() {
        val rdsClient = RdsClient.fromEnvironment()
        cachedToken = rdsClient.generateAuthenticationToken(
            GenerateAuthenticationTokenRequest.builder()
                .hostname("你的Aurora端点")
                .port(5432)
                .username("你的IAM用户名")
                .build()
        )
        expiryTime = Instant.now().plus(15, ChronoUnit.MINUTES)
    }

    fun getValidToken(): String {
        if (Instant.now().isAfter(expiryTime)) {
            refreshToken()
        }
        return cachedToken
    }
}
  1. 替换默认DataSource
    通过@Produces注入自定义的DataSource,覆盖Quarkus默认实现:
@ApplicationScoped
class DataSourceProducer {
    @Produces
    @ApplicationScoped
    fun dataSource(tokenCache: IamTokenCache): DataSource {
        return IamAuthDataSource(tokenCache)
    }
}

这种方式仅替换底层数据源实现,Hibernate Panache的业务代码完全不用修改。

Quarkus中的其他可行方案

  1. 使用Quarkus AWS RDS扩展
    Quarkus官方提供的AWS RDS扩展可直接集成IAM认证,配置简单且自动处理令牌刷新,完全兼容Hibernate Panache。只需在application.properties中添加:
quarkus.datasource.db-kind=postgresql
quarkus.datasource.jdbc.url=jdbc:postgresql://你的Aurora端点:5432/数据库名
quarkus.datasource.username=你的IAM用户名
quarkus.datasource.iam-authentication=true
quarkus.aws.region=你的AWS区域
  1. 切换到Quarkus Reactive SQL Client
    如果项目可接受部分代码调整,Reactive Postgres Client原生支持IAM认证,性能更优。但需要将Hibernate Panache的同步查询改为反应式风格,适合本身有反应式需求的场景。

内容的提问来源于stack exchange,提问作者Sherlock Wayne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:50:09