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
相关产品推荐
相关产品推荐

