Un accesso secondario a Facebook con Spring Social

1. Panoramica

In questo tutorial, ci concentreremo sull'aggiunta di un nuovo accesso di Facebook a un'app di accesso al modulo esistente.

Useremo il supporto Spring Social per interagire con Facebook e mantenere le cose pulite e semplici.

2. Configurazione Maven

Innanzitutto, dovremo aggiungere la dipendenza spring-social-facebook al nostro pom.xml :

 org.springframework.social spring-social-facebook 2.0.3.RELEASE 

3. Configurazione della sicurezza: solo login tramite modulo

Iniziamo innanzitutto dalla semplice configurazione della sicurezza in cui abbiamo solo l'autenticazione basata su form:

@Configuration @EnableWebSecurity @ComponentScan(basePackages = { "com.baeldung.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(); } }

Non passeremo molto tempo su questa configurazione: se vuoi capirla meglio, dai un'occhiata all'articolo di login del modulo.

4. Le proprietà di Facebook

Quindi, configuriamo le proprietà di Facebook nella nostra application.properties :

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

Nota che:

  • Dobbiamo creare un'applicazione Facebook per ottenere appId e appSecret
  • Dalle impostazioni dell'applicazione Facebook, assicurati di aggiungere "Sito web" della piattaforma e // localhost: 8080 / è l '"URL del sito"

5. Configurazione di sicurezza - Aggiunta di Facebook

Ora, aggiungiamo un nuovo modo per autenticarsi nel sistema, guidato da Facebook:

public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private FacebookConnectionSignup facebookConnectionSignup; @Value("${spring.social.facebook.appSecret}") String appSecret; @Value("${spring.social.facebook.appId}") String appId; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login*","/signin/**","/signup/**").permitAll() ... } @Bean public ProviderSignInController providerSignInController() { ConnectionFactoryLocator connectionFactoryLocator = connectionFactoryLocator(); UsersConnectionRepository usersConnectionRepository = getUsersConnectionRepository(connectionFactoryLocator); ((InMemoryUsersConnectionRepository) usersConnectionRepository) .setConnectionSignUp(facebookConnectionSignup); return new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, new FacebookSignInAdapter()); } private ConnectionFactoryLocator connectionFactoryLocator() { ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry(); registry.addConnectionFactory(new FacebookConnectionFactory(appId, appSecret)); return registry; } private UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) { return new InMemoryUsersConnectionRepository(connectionFactoryLocator); } }

Esaminiamo attentamente la nuova configurazione:

  • stiamo usando un ProviderSignInController per abilitare l'autenticazione di Facebook, che richiede due cose:

    in primo luogo, un ConnectionFactoryLocator registrato come FacebookConnectionFactory con le proprietà di Facebook che abbiamo definito in precedenza.

    secondo, un InMemoryUsersConnectionRepository .

  • inviando un POST a " / signin / facebook ": questo controller avvierà un accesso utente utilizzando il provider di servizi Facebook
  • stiamo configurando un SignInAdapter per gestire la logica di accesso nella nostra applicazione
  • e abbiamo anche impostato un ConnectionSignUp per gestire la registrazione implicita degli utenti quando si autenticano per la prima volta con Facebook

6. L'adattatore di accesso

In poche parole, questo adattatore è un ponte tra il controller sopra, che guida il flusso di accesso degli utenti di Facebook, e la nostra specifica applicazione locale:

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

Tieni presente che gli utenti che hanno effettuato l'accesso tramite Facebook avranno il ruolo FACEBOOK_USER , mentre gli utenti che hanno effettuato l'accesso utilizzando il modulo avranno il ruolo USER.

7. Registrazione della connessione

Quando un utente si autentica con Facebook per la prima volta, non ha un account esistente nella nostra applicazione.

Questo è il punto in cui dobbiamo creare automaticamente quell'account per loro; utilizzeremo un ConnectionSignUp per guidare la logica di creazione dell'utente:

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

Come puoi vedere, abbiamo creato un account per il nuovo utente, utilizzando il suo DisplayName come nome utente.

8. Il front-end

Infine, diamo un'occhiata al nostro front-end.

Ora avremo il supporto per questi due flussi di autenticazione - login form e Facebook - sulla nostra pagina di login:

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

Infine, ecco index.html :

Username

Logout

User authorities

Nota come questa pagina di indice mostra i nomi utente e le autorità.

E questo è tutto: ora abbiamo due modi per autenticarci nell'applicazione.

9. Conclusione

In this quick article, we learned how to use spring-social-facebook to implement a secondary authentication flow for our application.

And of course, as always, the source code is fully available over on GitHub.