spring-boot - 如何使用注册/登录适配器为 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 Boot 1.x。
但是,如果您使用的是 Boot 2.x,则需要在 SecurityConfig中定义ConnectionFactoryLocator
and :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 文章,该文章已更新。
推荐阅读
- android - 使用颤振启动时不会传播权限请求,但直接使用 android 启动时会传播
- android - Android 数据发送到活动
- python - Keras 错误:预计会看到 1 个数组,但得到了 1816
- javascript - 在 Javascript 中选择 KendoGrid 上的多个单元格
- matlab - 如何验证模型输出和观察到的数据分布是否相似?
- c++ - 使用 Gdiplus Graphics::DrawImage 在大图像上崩溃
- powerpoint - 在 Powerpoint 中创建 3D 表格
- sorting - 如何在 ELO 评级系统中随着对战的累积选择对战
- java - Java 正则表达式:使用 Matcher.matches() 查找字符串的最后一次出现
- python - 区分取消屏蔽任务和当前任务