如何覆写Micronaut默认JWTAuthentication实现自定义鉴权?
在Micronaut中适配X-XSRF-TOKEN头的JWT验证配置与自定义实现
我的微服务通过X-XSRF-TOKEN请求头传递JWT令牌,而非标准的Authorization: Bearer <token>方式。目前正在将部分服务迁移至Micronaut框架,但不清楚如何配置框架以适配这种令牌传递方式完成JWT验证。
示例请求
curl --location --request POST 'http://localhost:8080/api/v1/endpoint/action' \ --header 'X-XSRF-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJiYW5rIjoiSE9TVCIsInJvbGUiOiJiZGZmNjBmNDRhYmE0MzIzODM5OWI3N2U5NDc4OGMxMSIsIkRFUExPWU1FTlRfTkFNRVNQQUNFIjoic2VydmljZS1zdGFnaW5nIiwiZnVsbE5hbWUiOiJmaXJzdG5hbWUgbGFzdG5hbWUiLCJhZ2VuY3lDb2RlIjoiIiwib3BlcmF0b3JDb2RlIjoiIiwiTEFTVC1BQ0NFU1MtVElNRSI6IjE3MTI3NDk5Mjg5MTgiLCJ1c2VybmFtZSI6ImZpcnN0bmFtZWxhc3RuYW1lQEdNQUlMLkNPTSIsImV4cCI6MTcxMjc1MDUyOH0.lH2gGiTkzg5pPo7mp7dhBaMwbpYTTR7YmGysrWJYcyk'
当前安全配置YAML
token: csrf: enabled: true bearer: enabled: false header-name: X-XSRF-TOKEN jwt: signatures: secret: generator: secret: "${JWT_GENERATOR_SIGNATURE_SECRET:eefe82f8-7ca6-11ea-bc55-0242ac130003}"
可以通过自定义Bean覆写Micronaut的JWT验证逻辑,让鉴权流程使用自定义逻辑处理X-XSRF-TOKEN头的令牌,具体实现步骤如下:
1. 自定义令牌提取器
实现TokenResolver接口,专门从X-XSRF-TOKEN头中提取JWT令牌:
import io.micronaut.http.HttpRequest; import io.micronaut.security.token.TokenResolver; import jakarta.inject.Singleton; import java.util.Optional; @Singleton public class XsrfTokenResolver implements TokenResolver { private static final String X_XSRF_TOKEN_HEADER = "X-XSRF-TOKEN"; @Override public Optional<String> resolveToken(HttpRequest<?> request) { return Optional.ofNullable(request.getHeaders().get(X_XSRF_TOKEN_HEADER)); } }
2. 自定义JWT验证逻辑(可选)
如果需要完全自定义验证规则,可以实现JwtTokenValidator接口,或继承默认实现扩展逻辑:
import io.micronaut.security.authentication.AuthenticationException; import io.micronaut.security.token.jwt.validator.JwtTokenValidator; import io.micronaut.security.token.jwt.validator.JwtValidationResult; import io.micronaut.security.token.jwt.validator.JwtValidatorConfiguration; import jakarta.inject.Singleton; import org.reactivestreams.Publisher; import reactor.core.publisher.Mono; @Singleton public class CustomJwtTokenValidator implements JwtTokenValidator { private final JwtValidatorConfiguration configuration; public CustomJwtTokenValidator(JwtValidatorConfiguration configuration) { this.configuration = configuration; } @Override public Publisher<JwtValidationResult> validateToken(String token) { try { // 实现自定义验证逻辑: // 1. 解析JWT结构 // 2. 用配置密钥验证签名 // 3. 校验过期时间、自定义声明等规则 // 4. 返回验证结果 return Mono.just(JwtValidationResult.success(/* 解析后的JWT对象 */)); } catch (Exception e) { return Mono.error(new AuthenticationException("Invalid JWT token")); } } }
3. 启用自定义实现
由于自定义类已通过@Singleton注解注册为Bean,Micronaut会自动发现并优先使用这些实现,替换默认的令牌提取器和验证器。当前YAML中bearer.enabled: false的配置无需修改,确保默认Bearer逻辑不生效。
内容的提问来源于stack exchange,提问作者thickGlass
相关产品推荐
相关产品推荐

