Вторичный Facebook Войти с Spring Social

Вторичный вход в 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.