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

Spring Boot 3.x升级后出现SQS安全令牌无效错误求助

问题解决指引

一、SQS 403安全令牌无效问题排查与修复

核心排查方向及修复步骤

  • 验证凭证加载优先级
    AWS SDK 2.x在Java 17+环境下的凭证加载顺序有调整,优先读取系统属性、环境变量,再到本地凭证文件、IAM角色(ECS/EKS等环境)。需确认应用未被错误凭证源覆盖:
    • 检查是否存在冲突的系统属性:aws.accessKeyId/aws.secretAccessKey是否被其他配置意外注入
    • 核对环境变量AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY的取值正确性
    • 若使用指定profile,需在SQS客户端构建时明确配置,避免默认加载错误profile:
      SqsClient sqsClient = SqsClient.builder()
              .credentialsProvider(ProfileCredentialsProvider.create("your-target-profile"))
              .region(Region.US_EAST_1)
              .build();
      
  • 检查临时凭证有效性
    如果使用STS临时令牌,确认令牌是否过期,或STS角色的信任关系在升级后是否被修改。可通过调用STS接口验证当前凭证身份:
    StsClient stsClient = StsClient.create();
    GetCallerIdentityResponse identityResp = stsClient.getCallerIdentity(GetCallerIdentityRequest.builder().build());
    System.out.println("当前凭证身份: " + identityResp.userId());
    
  • 修复SDK版本兼容性
    当前使用的sqs-2.21.46版本可能与Spring Cloud 3.x存在兼容问题,建议升级到最新稳定版(如2.25.x+),同时匹配Spring Cloud AWS依赖版本:
    <!-- Spring Cloud AWS SQS Starter -->
    <dependency>
        <groupId>io.awspring.cloud</groupId>
        <artifactId>spring-cloud-starter-aws-sqs</artifactId>
        <version>3.0.2</version> <!-- 与Spring Cloud 3.x版本匹配 -->
    </dependency>
    
  • 异步客户端配置校验
    若使用异步SQS客户端,确保构建时凭证提供者配置正确,避免默认加载错误凭证:
    SqsAsyncClient sqsAsyncClient = SqsAsyncClient.builder()
            .credentialsProvider(DefaultCredentialsProvider.create())
            .region(Region.US_EAST_1)
            .build();
    

错误日志解读

Caused by: software.amazon.awssdk.services.sqs.model.SqsException: The security token included in the request is invalid. (Service: Sqs, Status Code: 403, Request ID: 13c71e7e-67a3-5ade-a474-410b92f7b091)
at software.amazon.awssdk.services.sqs.model.SqsException$BuilderImpl.build(SqsException.java:104) ~[sqs-2.21.46.jar:na]
... 1 common frames omitted

该日志明确指向凭证本身无效,而非权限不足(权限问题会提示AccessDenied),重点排查凭证来源和有效性即可。

二、SecurityFilterChain中Keycloak过滤器升级指引

Spring Boot 3.x搭配Spring Security 6.x,Keycloak已从旧的KeycloakAuthenticationFilter迁移到OAuth2适配方案,需调整过滤器配置:

旧版本(Spring Boot 2.x)典型代码

http.addFilterBefore(keycloakAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
http.addFilterBefore(keycloakPreAuthActionsFilter(), LogoutFilter.class);

升级后(Spring Boot 3.x + Spring Security 6.x)配置

  1. 引入适配依赖:
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-security-adapter</artifactId>
    <version>22.0.5</version> <!-- 与Keycloak服务器版本匹配 -->
</dependency>
  1. 修改SecurityFilterChain配置:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    // 配置Keycloak认证入口点
    KeycloakWebSecurityConfigurerAdapter.keycloakAuthenticationEntryPoint(http);
    
    http
        .authorizeHttpRequests(auth -> auth
            .anyRequest().authenticated()
        )
        // 推荐使用OAuth2资源服务器模式替代旧过滤器
        .oauth2ResourceServer(oauth2 -> oauth2
            .jwt(jwt -> jwt
                .jwtAuthenticationConverter(keycloakJwtConverter())
            )
        )
        // 若需保留旧过滤器,需适配Security 6.x的过滤器顺序
        .addFilterAt(keycloakAuthenticationFilter(), BearerTokenAuthenticationFilter.class)
        .addFilterBefore(keycloakPreAuthActionsFilter(), BearerTokenAuthenticationFilter.class);
    
    return http.build();
}

// 自定义JWT转换器,适配Keycloak的角色声明
private Converter<Jwt, AbstractAuthenticationToken> keycloakJwtConverter() {
    JwtAuthenticationConverter converter = new JwtAuthenticationConverter();
    converter.setJwtGrantedAuthoritiesConverter(new KeycloakRealmRoleConverter());
    return converter;
}
  1. 注意:Spring Security 6.x过滤器顺序已调整,需确保Keycloak过滤器位置正确,避免被其他过滤器拦截。优先推荐使用oauth2ResourceServer().jwt()的标准配置,替代旧的过滤器方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:12:42