34 lines
1.7 KiB
Java
34 lines
1.7 KiB
Java
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;
|
|
}
|
|
}
|