Spring通过Eureka从身份验证服务中获取公钥

时间:2018-12-20 16:17:51

标签: spring spring-security netflix-eureka

我正在实现一个Spring Security Resource Server,该服务器使用公共密钥来验证JWT令牌。
我正在尝试通过Eureka服务从我构建的身份验证服务中获取公钥。
服务在Eureka上注册之前,在服务启动时进行提取。
因此,在调用身份验证服务时,将引发UnknownHostException。
我可以在Eureka注册完成后修改订单并设置密钥吗?

@EnableResourceServer
public class MyResourceServerConfig extends 
AuthorizationServerConfigurerAdapter {

    @Bean
    @Primary
    public DefaultTokenServices tokenServices() {
        DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setTokenStore(tokenStore());
        return defaultTokenServices;
    }

    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

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

        HttpEntity<Void> request = new HttpEntity<Void>(new HttpHeaders());
        ResponseEntity<Map> responseEntity = restTemplate.exchange(AUTH_URI, HttpMethod.GET, request, Map.class);
        String publicKey = (String) responseEntity.getBody().get("value");            
        converter.setVerifierKey(publicKey);

        return converter;
    }
}

1 个答案:

答案 0 :(得分:0)

@DependsOn注释可以提供帮助。

来自文档:

  

...在不通过属性或构造函数参数显式依赖另一个Bean而是依赖于另一个Bean初始化的副作用的情况下,很少使用。 ...

您可以尝试将@Depends("discoveryClient")添加到实现身份验证服务客户端的类中。

注意:我尚未测试bean名称是否应为discoveryClient。如果这不起作用,请查看调试日志以查看正确的bean名称。