除了我现有的使用jwt的注册/登录功能之外,我还希望实现社交注册/登录功能。
我遵循了本教程:https://www.baeldung.com/facebook-authentication-with-spring-security-and-social,但是与社会安全性相关的自动装配相关类:ConnectionFactoryLocator,UsersConnectionRepository似乎不起作用,即使该示例建议这样做也可以。
我如何以及在哪里定义这些bean?我似乎找不到任何好的例子。
我想使用在UserService中调用我现有功能的注册/登录适配器结束。
https://www.baeldung.com/facebook-authentication-with-spring-security-and-social
@Configuration
@EnableWebSecurity
@ComponentScan(basePackages = { "com.example.lolsocial.baeldung.security"
})
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private ConnectionFactoryLocator connectionFactoryLocator;
@Autowired
private UsersConnectionRepository usersConnectionRepository;
@Autowired
private FacebookConnectionSignup facebookConnectionSignup;
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws
Exception {
auth.userDetailsService(userDetailsService);
}
@Override
protected void configure(final HttpSecurity http) throws Exception {
// @formatter:off
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/login*","/signin/**","/signup/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").permitAll()
.and()
.logout();
} // @formatter:on
@Bean
// @Primary
public ProviderSignInController providerSignInController() {
((InMemoryUsersConnectionRepository)
usersConnectionRepository).setConnectionSignUp(facebookConnectionSignup);
return new ProviderSignInController(connectionFactoryLocator,
usersConnectionRepository, new FacebookSignInAdapter());
}
}
预期:让登录/注册适配器正常工作,它们仅在我的UserService中调用signin()/ signup()方法。
实际:由于社会保险金币未自动接线而当前无法正常工作。(ConnectionFactoryLocator,UsersConnectionRepository)
自动装配失败
您正在使用的配置应该可以在Spring Boot 1.x上很好地工作。
但是,如果您使用的是Boot 2.x,则需要在SecurityConfig中定义ConnectionFactoryLocator
和UsersConnectionRepository
:
private ConnectionFactoryLocator connectionFactoryLocator() {
ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();
registry.addConnectionFactory(new FacebookConnectionFactory(appId, appSecret));
return registry;
}
private UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
return new InMemoryUsersConnectionRepository(connectionFactoryLocator);
}
这里,appId
和appSecret
来自application.properties。
您还需要更改ProviderSignInController
bean的实现:
@Bean
public ProviderSignInController providerSignInController() {
ConnectionFactoryLocator connectionFactoryLocator = connectionFactoryLocator();
UsersConnectionRepository usersConnectionRepository = getUsersConnectionRepository(connectionFactoryLocator);
((InMemoryUsersConnectionRepository) usersConnectionRepository).setConnectionSignUp(facebookConnectionSignup);
return new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, new FacebookSignInAdapter());
}
有关详细信息,请参阅您提到的Baeldung文章,此文章已更新。