Вторичный вход в Facebook через Spring Social
1. обзор
В этом руководстве мы сосредоточимся на добавлении новой учетной записи Facebook в существующее приложение для входа с помощью формы.
Мы собираемся использовать службу поддержки Spring Social, чтобы взаимодействовать с Facebook и упростить работу.
2. Конфигурация Maven
Во-первых, нам нужно добавить зависимостьspring-social-facebook к нашемуpom.xml:
org.springframework.social
spring-social-facebook
3. Security Config - просто форма входа
Давайте сначала начнем с простой конфигурации безопасности, где у нас просто аутентификация на основе форм:
@Configuration
@EnableWebSecurity
@ComponentScan(basePackages = { "org.example.security" })
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.userDetailsService(userDetailsService);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/login*").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").permitAll();
}
}
Мы не собираемся тратить много времени на эту конфигурацию - если вы хотите лучше ее понять, взгляните наthe form login article.
4. Конфигурация безопасности - Добавление Facebook
Теперь давайте добавим новый способ аутентификации в системе, основанный на Facebook:
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private ConnectionFactoryLocator connectionFactoryLocator;
@Autowired
private UsersConnectionRepository usersConnectionRepository;
@Autowired
private FacebookConnectionSignup facebookConnectionSignup;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login*","/signin/**","/signup/**").permitAll()
...
}
@Bean
public ProviderSignInController providerSignInController() {
((InMemoryUsersConnectionRepository) usersConnectionRepository)
.setConnectionSignUp(facebookConnectionSignup);
return new ProviderSignInController(
connectionFactoryLocator,
usersConnectionRepository,
new FacebookSignInAdapter());
}
}
Давайте внимательно посмотрим на новую конфигурацию:
-
мы используемProviderSignInController для включения аутентификации Facebook
-
отправивPOST в «/signin/facebook» - этот контроллер инициирует вход пользователя в систему с помощью поставщика услуг Facebook
-
мы настраиваемSignInAdapter для обработки логики входа в наше приложение
-
и мы также настраиваемConnectionSignUp для неявной обработки регистрации пользователей, когда они впервые проходят аутентификацию в Facebook.
5. Входной адаптер
Проще говоря, этот адаптер является мостом между контроллером выше - управляющим потоком входа пользователя Facebook - и нашим конкретным локальным приложением:
public class FacebookSignInAdapter implements SignInAdapter {
@Override
public String signIn(
String localUserId,
Connection> connection,
NativeWebRequest request) {
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(
connection.getDisplayName(), null,
Arrays.asList(new SimpleGrantedAuthority("FACEBOOK_USER"))));
return null;
}
}
Обратите внимание, что пользователи, вошедшие в систему с помощью Facebook, будут иметь рольFACEBOOK_USER, а пользователи, вошедшие с помощью формы, будут иметь рольUSER.
6. Подключение Регистрация
Когда пользователь впервые проходит аутентификацию в Facebook, у него нет учетной записи в нашем приложении.
Это тот момент, когда нам нужно автоматически создать эту учетную запись для них; мы собираемся использоватьConnectionSignUp для управления этой логикой создания пользователя:
@Service
public class FacebookConnectionSignup implements ConnectionSignUp {
@Autowired
private UserRepository userRepository;
@Override
public String execute(Connection> connection) {
User user = new User();
user.setUsername(connection.getDisplayName());
user.setPassword(randomAlphabetic(8));
userRepository.save(user);
return user.getUsername();
}
}
Как видите, мы создали учетную запись для нового пользователя, используя ихDisplayName в качестве имени пользователя.
7. Свойства Facebook
Затем давайте настроим свойства Facebook в нашемapplication.properties:
spring.social.facebook.appId=YOUR_APP_ID
spring.social.facebook.appSecret=YOUR_APP_SECRET
Обратите внимание, что:
-
Нам нужно создать приложение Facebook, чтобы получитьappId иappSecret
-
В настройках приложения Facebook убедитесь, что вы добавили платформу «Веб-сайт», аhttp://localhost:8080/ - это «URL сайта».
8. Передний конец
Наконец, давайте взглянем на наш интерфейс.
Теперь у нас будет поддержка этих двух потоков аутентификации - формы входа и Facebook - на нашей странице входа:
You have been logged out
There was an error, please try again
Наконец, вотindex.html:
Welcome, Username
User authorities
Обратите внимание, как на этой индексной странице отображаются имена пользователей и права доступа.
Вот и все - теперь у нас есть два способа аутентификации в приложении.
9. Заключение
В этой быстрой статье мы узнали, как использоватьspring-social-facebook для реализации вторичного потока аутентификации для нашего приложения.
И конечно, как всегда, полностью доступен исходный кодover on GitHub.