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

Micronaut中如何用ReactiveJwksSignature替代已废弃的JwksSignature实现JWT验证?

Micronaut中如何用ReactiveJwksSignature替代已废弃的JwksSignature实现JWT验证?

嘿,我来帮你搞定这个替换废弃类的问题,结合你的代码和配置一步步梳理清楚:

1. 先搞懂核心变化

旧的JwksSignature是阻塞式实现,新的ReactiveJwksSignature是响应式的(基于Reactor框架),而且Micronaut会自动根据你application.yml里的JWKS配置创建对应的Bean,完全不需要手动实例化,这是和旧版本最大的区别。

2. 简化你的TokenValidator实现

你原来的代码手动实例化JwksSignature,还要注入一堆依赖,现在可以彻底简化,直接通过BeanLocator获取Micronaut已经帮你配置好的ReactiveJwksSignature实例就行。

修改后的TokenValidator.kt代码如下:

package com.xd.cw.external.config

import com.nimbusds.jwt.SignedJWT
import io.micronaut.context.BeanLocator
import io.micronaut.inject.qualifiers.Qualifiers
import io.micronaut.security.token.jwt.nimbus.ReactiveJwksSignature
import jakarta.inject.Singleton
import org.slf4j.Logger
import org.slf4j.LoggerFactory

interface ITokenValidator {
    fun validate(token: String): Boolean
}

@Singleton
open class TokenValidator(
    private val beanLocator: BeanLocator,
) : ITokenValidator {
    private val logger: Logger = LoggerFactory.getLogger(TokenValidator::class.java)

    // 根据你配置里的name(teacherV3)获取对应的签名Bean
    private val teacherV3Signature: ReactiveJwksSignature = beanLocator.getBean(
        ReactiveJwksSignature::class.java,
        Qualifiers.byName("teacherV3"),
    )

    override fun validate(token: String): Boolean {
        return try {
            val signedJWT = SignedJWT.parse(token)
            // 调用响应式的verify方法,用block()阻塞获取结果(你的Filter已经在BLOCKING线程池,这么做完全安全)
            val isValid = teacherV3Signature.verify(signedJWT).block() ?: false
            if (!isValid) {
                logger.info("Invalid JWT signature to access Swagger UI")
            }
            isValid
        } catch (e: Exception) {
            logger.info("JWT validation error to access Swagger UI: ${e.message}")
            false
        }
    }
}

3. 如果需要验证多个JWKS签名

如果你要验证token是否匹配三个JWKS中的任意一个,只需要把获取单个Bean改成获取所有ReactiveJwksSignature实例,然后逐个验证:

// 替换单个Bean的获取逻辑,拿到所有配置的JWKS签名Bean
private val allJwksSignatures: List<ReactiveJwksSignature> = beanLocator.findBeans(ReactiveJwksSignature::class.java).toList()

override fun validate(token: String): Boolean {
    return try {
        val signedJWT = SignedJWT.parse(token)
        // 只要有一个签名验证通过就返回true
        val isValid = allJwksSignatures.any { signature ->
            signature.verify(signedJWT).block() ?: false
        }
        if (!isValid) {
            logger.info("Invalid JWT signature to access Swagger UI")
        }
        isValid
    } catch (e: Exception) {
        logger.info("JWT validation error to access Swagger UI: ${e.message}")
        false
    }
}

4. 确认依赖是否到位

确保你的构建文件(比如build.gradle.kts)里包含了Nimbus JWT的依赖,Micronaut 4.x版本必须要有这个:

implementation("io.micronaut.security:micronaut-security-jwt-nimbus")

为啥原来手动实例化不行?

ReactiveJwksSignature的构造函数是内部封装的,Micronaut会根据你application.yml里的micronaut.security.token.jwt.signatures.jwks配置自动完成Bean的创建、缓存、JWKS刷新等逻辑,每个配置项的key(比如teacherV3)就是Bean的限定名,所以直接通过BeanLocator获取才是标准用法,完全不需要自己去构造。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:18:18