ClientDetailsS​​ervice AuthorizationServerConfigurerAdapter

时间:2015-06-23 00:16:38

标签: java spring oauth-2.0

我正在尝试将所有特定于环境的bean分组在几个类中,而我在OAuth2类型的应用程序中遇到ClientDetailsS​​ervice问题。

@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

  @Autowired
  private UserDetailsService userDetailsService;

  ...

  @Autowired
  private ClientDetailsService clientDetailsService;

  ...

  @Override
  public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
      clients.withClientDetails( clientDetailsService );
  }
}

然后我有一个单独的配置类:

@Configuration
@Profile(value={"default"})
public class DevConfiguration {

  ...

  @Bean
  public ClientDetailsService clientDetailsService() {
    return new InMemoryClientDetailsService();
  }

  @Bean
  public UserDetailsService userDetailsService() {
    return new InMemoryUserDetails();
  }

  ...

}

然后,我将使用JDBC实现的ProductionConfiguration类,以及所有这些服务。我的想法是AuthorizationServerConfiguration有很多适用于所有环境的东西(令牌增强器,端点配置等),所以我想避免复制/粘贴所有代码。

问题是我的public ClientDetailsService clientDetailsService()未被调用,而@Autowired clientDetailsService中的AuthorizationServerConfiguration似乎被代理,就像它没有找到创建ClientDetailsService实例的代码一样。 当应用程序按ID加载客户端详细信息时,我最终得到StackOverflowError(猜测代理正在调用自己)。

我可以看到其他@Bean正在从DevConfiguration实例化(如UserDetailsService),因此在配置应用程序时肯定会考虑该类。我非常希望避免使用限定符。

我做错了什么? 从AuthorizationServerConfigurerAdapter之类的“外部化”数据存储等的最佳方法是什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我的AuthorizationServerConfiguration实际上在另一个@Configuration课程中。 原来,将AuthorizationServerConfiguration移动到自己的文件解决了这个问题。