package com.baiyue.common.security; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.security.oauth2.jose.jws.MacAlgorithm; import org.springframework.security.oauth2.jwt.JwtDecoder; import org.springframework.security.oauth2.jwt.JwtValidators; import org.springframework.security.oauth2.jwt.NimbusJwtDecoder; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; /** * HMAC JWT 解码器自动配置,按共享密钥和签发方构建统一令牌验证器。 */ @AutoConfiguration(before = BaiyueSecurityAutoConfiguration.class) @ConditionalOnProperty(name = "baiyue.security.jwt-mode", havingValue = "hmac", matchIfMissing = true) public class HmacJwtDecoderAutoConfiguration { @Bean @ConditionalOnMissingBean(JwtDecoder.class) JwtDecoder jwtDecoder(@Value("${baiyue.security.jwt-secret}") String jwtSecret, @Value("${baiyue.security.issuer:auth-service}") String issuer) { byte[] secret = jwtSecret.getBytes(StandardCharsets.UTF_8); if (secret.length < 32) throw new IllegalStateException("JWT_SECRET 至少需要 32 字节"); NimbusJwtDecoder decoder = NimbusJwtDecoder.withSecretKey(new SecretKeySpec(secret, "HmacSHA256")) .macAlgorithm(MacAlgorithm.HS256).build(); decoder.setJwtValidator(JwtValidators.createDefaultWithIssuer(issuer)); return decoder; } }