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.