如何解决自定义/覆盖 ClientRegistrationRepository 时无法从 application.yml 读取属性
我正在尝试实现本文档中提到的自定义客户端存储库。
根据文档,属性在代码中是硬编码的,我试图从 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 举报,一经查实,本站将立刻删除。