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

如何在Spring Authorization Server中删除数据库堆积的过期令牌

问题解答

官方机制说明

Spring Authorization Server(包括你使用的0.2.0版本)本身没有内置过期授权记录的自动清理能力,你没有遗漏官方提供的现有功能,这类清理逻辑确实需要自行扩展实现。

现有方案的优化建议

你当前通过继承JdbcOAuth2AuthorizationService添加定时任务的思路已经是业内通用的轻量方案,只需要做少量调整就可以解决强依赖数据库特性的问题:

  • 把数据库内置时间函数替换为应用层计算的时间参数,SQL改为参数化查询,兼容所有支持JDBC的数据库:
class ExpiredTokenDeletingOAuth2AuthorizationService(
    jdbcOperations: JdbcOperations, 
    registeredClientRepository: RegisteredClientRepository
) : JdbcOAuth2AuthorizationService(jdbcOperations, registeredClientRepository) {

    // 1.x版本可直接复用父类的表名常量,0.2.0版本若无该常量直接硬编码oauth2_authorization即可,SAS核心表结构无破坏性变更
    private val REMOVE_AUTHORIZATION_SQL = 
        "delete from oauth2_authorization where access_token_expires_at < ?"

    @Scheduled(cron = "0 0 * * * *") // 调整为每小时执行一次,可根据实际业务量调整频率
    fun removeExpiredAuthorizations() {
        jdbcOperations.update(REMOVE_AUTHORIZATION_SQL, Instant.now())
    }
}
  • 如果你是集群部署授权服务,建议给定时任务增加分布式锁(比如基于Redis、数据库乐观锁实现),避免多节点同时执行删除任务产生不必要的资源消耗。
  • 如果你升级到1.0及以上稳定版的Spring Authorization Server,还可以扩展出按过期时间批量查询OAuth2Authorization的方法,再调用官方的remove方法批量删除,完全和官方表结构解耦,缺点是查询+删除的性能比直接执行SQL稍低。

其他可选实现方案

如果业务规模很大,过期令牌数据量极高,也可以考虑以下方案:

  • 依赖数据库的定时任务:比如MySQL的事件调度器、PostgreSQL的pg_cron插件,直接在数据库层执行清理,完全不占用应用资源,缺点是不同数据库的配置方式不统一。
  • 在令牌颁发接口逻辑中加入低频率的清理触发逻辑:比如每颁发1000个令牌触发一次过期清理,不需要单独维护定时任务,缺点是会少量增加令牌颁发接口的响应耗时,适合并发量不高的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:06:08