Une connexion Facebook secondaire avec Spring Social

Une connexion secondaire à Facebook avec Spring Social

1. Vue d'ensemble

Dans ce didacticiel, nous allons nous concentrer sur l'ajout d'une nouvelle connexion Facebook à une application de connexion par formulaire existante.

Nous allons utiliser le support Spring Social pour interagir avec Facebook et garder les choses propres et simples.

2. Configuration Maven

Tout d'abord, nous devrons ajouter la dépendancespring-social-facebook à nospom.xml:


    org.springframework.social
    spring-social-facebook

3. Security Config - Just Form Login

Commençons par la configuration de sécurité simple où nous avons juste une authentification basée sur un formulaire:

@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();
    }
}

Nous n'allons pas passer beaucoup de temps sur cette configuration - si vous voulez mieux la comprendre, jetez un œil àthe form login article.

4. Configuration de sécurité - Ajout de Facebook

Maintenant, ajoutons une nouvelle façon de s'authentifier dans le système - pilotée par 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());
    }
}

Examinons attentivement la nouvelle configuration:

  • nous utilisons unProviderSignInController pour activer l'authentification Facebook

  • en envoyant unPOST à «/signin/facebook» - ce contrôleur lancera une connexion utilisateur à l'aide du fournisseur de services Facebook

  • nous configurons unSignInAdapter pour gérer la logique de connexion dans notre application

  • et nous avons également mis en place unConnectionSignUp pour gérer l'inscription implicite des utilisateurs lors de leur première authentification avec Facebook

5. L'adaptateur de connexion

En termes simples, cet adaptateur constitue un pont entre le contrôleur situé au-dessus, dirigeant le flux de connexion des utilisateurs de Facebook, et notre application locale spécifique:

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;
    }
}

Notez que les utilisateurs connectés via Facebook auront le rôleFACEBOOK_USER, tandis que les utilisateurs connectés via le formulaire auront le rôleUSER.

6. Connexion S'inscrire

Lorsqu'un utilisateur s'authentifie avec Facebook pour la première fois, il n'a pas de compte existant dans notre application.

C'est le moment où nous devons créer ce compte automatiquement pour eux; nous allons utiliser unConnectionSignUp pour piloter cette logique de création d'utilisateur:

@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();
    }
}

Comme vous pouvez le voir, nous avons créé un compte pour le nouvel utilisateur - en utilisant leursDisplayName comme nom d'utilisateur.

7. Les propriétés de Facebook

Ensuite, configurons les propriétés Facebook dans nosapplication.properties:

spring.social.facebook.appId=YOUR_APP_ID
spring.social.facebook.appSecret=YOUR_APP_SECRET

Notez que:

  • Nous devons créer une application Facebook pour obtenirappId etappSecret

  • Dans les paramètres de l'application Facebook, assurez-vous d'ajouter la plate-forme "Site Web" ethttp://localhost:8080/ est l '"URL du site"

8. Le front end

Enfin, jetons un œil à notre interface.

Nous allons désormais prendre en charge ces deux flux d'authentification - connexion par formulaire et Facebook - sur notre page de connexion:



You have been logged out
There was an error, please try again

Enfin, voici lesindex.html:





Welcome, Username

User authorities

Notez comment cette page d'index affiche les noms d'utilisateur et les autorités.

Et c’est tout - nous avons maintenant deux façons de s’authentifier dans l’application.

9. Conclusion

Dans cet article rapide, nous avons appris à utiliserspring-social-facebook pour implémenter un flux d'authentification secondaire pour notre application.

Et bien sûr, comme toujours, le code source est entièrement disponibleover on GitHub.