我正在尝试实现本文档中提到的定制客户端存储库。
https://docs.spring.io/spring-security/site/docs/5.0.x/reference/html/jc.html jc-oauth2login-completely-override-autoconfiguration
根据文档,属性在代码中硬编码,我试图从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;
....
Websecurity配置
@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