为了实现平滑过渡,默认的配置肯定不能用了,需要定制化一个JWT解码器。接下来我们一步步来实现它。
分离公私钥
资源服务器只能保存公钥,所以需要从之前的jks
文件中导出一个公钥。
keytool-export-aliasfelordcn-keystore<jks证书全路径>-file<导出cer的全路径>
例如:
keytool-export-aliasfelordcn-keystoreD:\keystores\felordcn.jks-filed:\keystores\publickey.cer
把分离的cer
公钥文件放到原来jks
文件的路径下面,资源服务器不再保存jks
。
自定义jwt解码器
spring-security-oauth2-jose
是Spring Security的jose规范依赖。我将根据该类库来实现自定义的JWT解码器。
/**
*基于Nimbus的jwt解码器,并增加了一些自定义校验策略
*@paramvalidatorthevalidator
*@returnthejwtdecoder
*/
@SneakyThrows
@Bean
publicJwtDecoderjwtDecoder(@Qualifier(“delegatingTokenValidator”)DelegatingOAuth2TokenValidatorvalidator){
CertificateFactorycertificateFactory=CertificateFactory.getInstance(“X.509”);
//从classpath路径读取cer公钥证书来配置解码器
ClassPathResourceresource=newClassPathResource(this.jwtProperties.getCertInfo().getPublicKeyLocation());
Certificatecertificate=certificateFactory.generateCertificate(resource.getInputStream());
PublicKeypublicKey=certificate.getPublicKey();
NimbusJwtDecodernimbusJwtDecoder=NimbusJwtDecoder.withPublicKey((RSAPublicKey)publicKey).build();
nimbusJwtDecoder.setJwtValidator(validator);
returnnimbusJwtDecoder;
}
上面的解码器基于我们的公钥证书,同时我还自定义了一些校验策略。不得不说Nimbus的jwt类库比jjwt要好用的多。