spring boot 2 中 jwt.key-uri 的替代品是什么

What's the replacement for jwt.key-uri in spring boot 2

我们正在使用具有以下属性的 spring boot 1 oauth。

安全。oauth2.resource.jwt.key-uri

spring boot2 不知何故丢失了它,有什么替代品吗?

我在 gitter chat 中问过同样的问题。

戴夫赛尔说:

Those features were removed. They are migrating to Spring Security. But slowly. The plan is to have a shim jar that you can use in the transition period. but that's not done yet @rwinch said he was going to publish something after Spring One (i.e. next week earliest)

所以还没有替代品。他们从 spring-boot 中删除了一些资源服务器自动配置。他们还没有将其添加回 spring-security。但这很快就会到来。

所以您目前所能做的就是从 spring-boot 1.5 复制所需的代码。

编辑

同时,有一个项目可以帮助您在 spring-boot 2 中获得 spring-security-oauth 自动配置 - 请参阅 https://github.com/spring-projects/spring-security-oauth2-boot

另请参阅 spring 引导 1.5->2.0 迁移指南 - https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide#oauth2

我在从 spring 引导 1 迁移到引导 2 时遇到了同样的事情。目前,您可以保持您的 oauth2 属性完全相同。我刚刚添加了一个使用 WebClient 检索 public 键的方法:

    private String getPublicKeyValue(String uriKey) {
    return Optional.of(WebClient.create(publicKeyUri))
                   .map(j -> j.get().retrieve().bodyToMono(JwtObject.class))
                   .map(Mono::block)
                   .map(JwtObject::getValue)
                   .orElseThrow(
                           () -> new RuntimeException("An error has occured while getting the public key from remote : " + publicKeyUri));
}

而 publicKeyUri 是:

@Value("${security.oauth2.resource.jwk.key-set-uri}")
private String publicKeyUri;

并像这样使用它:

   @Bean
public JwtAccessTokenConverter accessTokenConverter() {
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
    converter.setVerifierKey(getPublicKeyValue(publicKeyUri));
    return converter;
}

你也可以直接配置public键值而不是URI,这样更简单。

当然,这只是临时解决方案,直到spring boot 2 具有真正的功能。

我遇到了同样的问题,在网上搜索了很多资源后,我找到了这个解决方案:

有一个 JwkTokenStore(它不同于 JwtTokenStore)。这个 JwkTokenStore 在构造函数中接受一个字符串,该字符串指向一个键集-url.

所以我在我的 ResourceServer 配置中得到了这个:

@Value("${security.oauth2.resource.jwk.key-set-uri}")
private String keySetUri;

@Bean
public TokenStore tokenStore() {
   JwkTokenStore jwkTokenStore = new JwkTokenStore(keySetUri, accessTokenConverter());
   return jwkTokenStore;
}

@Bean
public JwtAccessTokenConverter accessTokenConverter() {
   JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
   return converter;
}

我将它与 Azure AD/OpenIDConnect 一起使用,对我们来说效果很好。

亲切的问候,

丹尼