微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自定义/覆盖 ClientRegistrationRepository 时无法从 application.yml 读取属性

如何解决自定义/覆盖 ClientRegistrationRepository 时无法从 application.yml 读取属性

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

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();
    }
}

解决方法

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

您的代码:

SsoPropertiesConfig ssoPropertiesConfig = new SsoPropertiesConfig();

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

注释了您的类

所以保持:

private SsoPropertiesConfig ssoPropertiesConfig;
,

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

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

@Autowired
SsoPropertiesConfig ssoPropertiesConfig;

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

   private final  SsoPropertiesConfig ssoPropertiesConfig; 

注意:必须使用final。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。