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

如何覆写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:36:05