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)配置
- 引入适配依赖:
<dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-spring-security-adapter</artifactId> <version>22.0.5</version> <!-- 与Keycloak服务器版本匹配 --> </dependency>
- 修改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; }
- 注意:Spring Security 6.x过滤器顺序已调整,需确保Keycloak过滤器位置正确,避免被其他过滤器拦截。优先推荐使用
oauth2ResourceServer().jwt()的标准配置,替代旧的过滤器方案。
内容的提问来源于stack exchange,提问作者Sreenivasan Nagarajan
相关产品推荐
相关产品推荐

