如何使用注册/登录适配器为Spring Boot配置Facebook注册/登录?

问题描述 投票:1回答:1

除了我现有的使用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)

自动装配失败

autowiring failing

spring-boot spring-social
1个回答
0
投票

您正在使用的配置应该可以在Spring Boot 1.x上很好地工作。

但是,如果您使用的是Boot 2.x,则需要在SecurityConfig中定义ConnectionFactoryLocatorUsersConnectionRepository

private ConnectionFactoryLocator connectionFactoryLocator() {
    ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();
    registry.addConnectionFactory(new FacebookConnectionFactory(appId, appSecret));
    return registry;
}

private UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
    return new InMemoryUsersConnectionRepository(connectionFactoryLocator);
} 

这里,appIdappSecret来自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文章,此文章已更新。

© www.soinside.com 2019 - 2024. All rights reserved.