customizing/overriding ClientRegistrationRepository 时无法从 application.yml 读取属性

Unable to read properties from application.yml while customizing/overriding ClientRegistrationRepository

我正在尝试实现本文档中提到的自定义客户端存储库。

https://docs.spring.io/spring-security/site/docs/5.0.x/reference/html/jc.html#jc-oauth2login-completely-override-autoconfiguration

根据文档,属性是硬编码在代码中的,我正在尝试从 application.yml 中读取这些属性。但是,当需要设置时,属性不可用。

请问这个怎么实现?如何在此处提供 application.yml 属性。

Application.yml:

sso:
  enabled: true
  registrationId: myApp
  clientName: myApp
  .....

POJO对应sso属性

@Data
@ConfigurationProperties("sso")
public class SsoPropertiesConfig {
    private boolean enabled;
    private String clientName;
    private String registrationId;
    ....

网络安全配置

@Slf4j
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {

    SsoPropertiesConfig ssoPropertiesConfig = new SsoPropertiesConfig();

    private final PasswordResolver passwordResolver;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .oauth2Login();
    }


    @Bean
    public ClientRegistrationRepository clientRegistrationRepository() {
        return new InMemoryClientRegistrationRepository(this.myClientRegistration());
    }

    private ClientRegistration myClientRegistration() {
        log.info("ssoPropertiesConfig :{}",ssoPropertiesConfig); 

// all properties of ssoPropertiesConfig are coming as NULL

        return ClientRegistration.withRegistrationId(ssoPropertiesConfig.getRegistrationId())
                .clientName(ssoPropertiesConfig.getClientName())
                ....
                .build();
    }
}

您正在使用 new 自己创建属性,而不是让 spring 使用依赖注入管理它们。

您的代码:

SsoPropertiesConfig ssoPropertiesConfig = new SsoPropertiesConfig();

您可以删除 new 声明,因为您已经用 @RequiredArgsConstructor

注释了 class

所以只保留:

private SsoPropertiesConfig ssoPropertiesConfig;

您需要将 SsoPropertiesConfig 注入到您想要使用它的地方,而是像 POJO 一样创建它,而不是 Spring bean。

您可以像这样使用@Autowired 注释

@Autowired
SsoPropertiesConfig ssoPropertiesConfig;

或者只要你有一个需要参数的构造函数,你就可以将它作为最终字段:

   private final  SsoPropertiesConfig ssoPropertiesConfig; 

注意:必须使用final。