【问题标题】:Unable to read properties from application.yml while customizing/overriding ClientRegistrationRepository自定义/覆盖 ClientRegistrationRepository 时无法从 application.yml 读取属性
【发布时间】:2021-05-28 18:14:03
【问题描述】:

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

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
  .....

sso属性对应的POJO

@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); 

// ssoPropertiesConfig 的所有属性都为 NULL

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

【问题讨论】:

    标签: spring-boot spring-security spring-security-oauth2 java-11


    【解决方案1】:

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

    你可以像这样使用@Autowired注解

    @Autowired
    SsoPropertiesConfig ssoPropertiesConfig;
    

    或者只是因为你有一个 requires arguments 构造函数,你可以将它作为一个 final 字段:

       private final  SsoPropertiesConfig ssoPropertiesConfig; 
    

    注意:你必须使用final。

    【讨论】:

      【解决方案2】:

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

      你的代码:

      SsoPropertiesConfig ssoPropertiesConfig = new SsoPropertiesConfig();
      

      您可以删除 new 声明,因为您已使用 @RequiredArgsConstructor 注释您的类

      所以保持:

      private SsoPropertiesConfig ssoPropertiesConfig;
      

      【讨论】:

        猜你喜欢
        • 2022-01-22
        • 1970-01-01
        • 2017-06-01
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        • 2021-12-30
        • 1970-01-01
        • 2020-12-08
        相关资源
        最近更新 更多