首页 > 解决方案 > 如何使用注册/登录适配器为 Spring Boot 配置 Facebook 注册/登录?

问题描述

除了使用 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() 方法。

实际:由于社会保障 bean 未自动装配,当前无法正常工作。( ConnectionFactoryLocator,UsersConnectionRepository )

自动装配失败

自动装配失败

标签: spring-bootspring-social

解决方案


您使用的配置应该适用于 Spring Boot 1.x。

但是,如果您使用的是 Boot 2.x,则需要在 SecurityConfig中定义ConnectionFactoryLocatorand :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。

您还需要更改ProviderSignInControllerbean 的实现:

@Bean
public ProviderSignInController providerSignInController() {
    ConnectionFactoryLocator connectionFactoryLocator = connectionFactoryLocator();
    UsersConnectionRepository usersConnectionRepository = getUsersConnectionRepository(connectionFactoryLocator);
    ((InMemoryUsersConnectionRepository) usersConnectionRepository).setConnectionSignUp(facebookConnectionSignup);
    return new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, new FacebookSignInAdapter());
}

有关详细信息,请参阅您提到的 Baeldung 文章,该文章已更新。


推荐阅读