添加自定义 OidcUserService 以与 Spring Azure AAD OidcUserService 一起使用

Adding a custom OidcUserService to work with Spring Azure AAD OidcUserService

我们有以下 Spring 安全配置 class 扩展 Spring Azure 配置适配器,并希望将自定义 OidcUserService 添加到 userInfo 回调。我们有 2 个独立的项目,一个原型项目和我们的真实项目。我们使用原型来证明它可以工作,一旦它工作了就将它转移到我们的真实项目中。两个项目的配置相同,pom/libraries 在 class 路径上,等等。但在实际项目中,我们收到一个错误,指出配置中存在循环依赖。我们不知道如何解决这个问题。

编辑:更多发现,看起来 Spring 在实际项目中将我们的自定义 OidcUserService 注入 AADO 安全 bean,而不是使用它们自己的,而原型放入正确的 AADO OidcUserService。就像 bean 实例化的顺序在项目之间是不同的,即使我们没有在任何一个项目中指定顺序。

这是两个项目中的配置代码。自定义 OidcUserService 与每个项目相同。 Copy/Pasted 从一个项目到另一个项目,包括此配置。

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
class AADOAuth2LoginSecurityConfig extends AADWebSecurityConfigurerAdapter {

@Resource
OAuth2UserService<OidcUserRequest, OidcUser> customOidcUserService;

@Override
protected void configure(HttpSecurity http) throws Exception {
    super.configure(http);
    http
            .authorizeRequests()
            .antMatchers("/", "/login", "/*.js", "/*.css").permitAll()
            .anyRequest().authenticated()
            .and()
            .csrf()
            .disable()
            .oauth2Login(oauth2Login ->
                    oauth2Login.userInfoEndpoint(userInfoEndpoint ->
                            userInfoEndpoint.oidcUserService(customOidcUserService)
                    )
            );
}

}

这是定制服务,如果你想看的话。

@Service
public class CustomOidcUserService implements OAuth2UserService<OidcUserRequest, OidcUser> {

final private OAuth2UserService<OidcUserRequest, OidcUser> aadoAuth2UserService;

public CustomOidcUserService(OAuth2UserService<OidcUserRequest, OidcUser> aadoAuth2UserService) {
    this.aadoAuth2UserService = aadoAuth2UserService;
}

public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2AuthenticationException {
    OidcUser oidcUser = aadoAuth2UserService.loadUser(userRequest);
    //Custom code would go here
    return oidcUser;
}

}

  1. source code of azure-spring-boot中有@ConditionalOnMissingBean,所以如果你定义CustomOidcUserService为bean,AADOAuth2UserServicebean将不会创建。

  2. But in the real project we get an error stating there is a circular dependency in the configuration. We can't figure out how to resolve this problem.。能否请您分享日志?

  3. whereas the prototype puts in the correct AADO OidcUserService,你是说correct AADO OidcUserService应该是AADOAuth2UserService吗?

  4. 对于此类问题,最好在 GitHub 中创建一个问题,并描述如何重现您的问题。所以你可以创建一个问题 here.