Et sekundært Facebook-login med Spring Social

1. Oversigt

I denne vejledning fokuserer vi på at tilføje et nyt Facebook-login til en eksisterende form-login-app.

Vi bruger Spring Social support til at interagere med Facebook og holde tingene rene og enkle.

2. Maven-konfiguration

Først skal vi tilføje forår-social-facebook afhængighed af vores pom.xml:

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

3. Sikkerhedskonfiguration - Bare form login

Lad os først starte med den enkle sikkerhedskonfiguration, hvor vi bare har formbaseret godkendelse:

@Configuration @EnableWebSecurity @ComponentScan (basePackages = {"com.baeldung.security"}) offentlig klasse SecurityConfig udvider WebSecurityConfigurerAdapter {@Autowired privat UserDetailsService userDetailsService; @ Override beskyttet ugyldig konfiguration (AuthenticationManagerBuilder auth) kaster Undtagelse {auth.userDetailsService (userDetailsService); } @ Override beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http .csrf (). Deaktiver () .authorizeRequests () .antMatchers ("/ login *"). PermitAll () .anyRequest (). Godkendt (). Og ( ) .formLogin (). loginPage ("/ login"). permitAll (); }}

Vi bruger ikke meget tid på denne konfiguration - hvis du vil forstå det bedre, skal du kigge på formular login-artiklen.

4. Facebook-egenskaberne

Lad os derefter konfigurere Facebook-egenskaber i vores application.properties:

spring.social.facebook.appId = DIN_APP_ID spring.social.facebook.appSecret = DIN_APP_SECRET

Noter det:

  • Vi er nødt til at oprette en Facebook-applikation for at få den appId og appSecret
  • Fra Facebook-applikationsindstillinger skal du sørge for at tilføje platform "Website" og // localhost: 8080 / er "websteds-URL"

5. Sikkerhedskonfiguration - Tilføjelse af Facebook

Lad os nu tilføje en ny måde at godkende ind i systemet - drevet af Facebook:

offentlig klasse SecurityConfig udvider WebSecurityConfigurerAdapter {@Autowired privat FacebookConnectionSignup facebookConnectionSignup; @Value ("$ {spring.social.facebook.appSecret}") String appSecret; @Value ("$ {spring.social.facebook.appId}") String appId; @ Override beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http .authorizeRequests () .antMatchers ("/ login *", "/ signin / **", "/ signup / **"). PermitAll () ...} @Bean offentlig ProviderSignInController providerSignInController () {ConnectionFactoryLocator connectionFactoryLocator = connectionFactoryLocator (); UsersConnectionRepository usersConnectionRepository = getUsersConnectionRepository (connectionFactoryLocator); ((InMemoryUsersConnectionRepository) brugereConnectionRepository) .setConnectionSignUp (facebookConnectionSignup); returner ny ProviderSignInController (connectionFactoryLocator, usersConnectionRepository, ny FacebookSignInAdapter ()); } privat ConnectionFactoryLocator connectionFactoryLocator () {ConnectionFactoryRegistry registry = ny ConnectionFactoryRegistry (); registry.addConnectionFactory (ny FacebookConnectionFactory (appId, appSecret)); returregister } private BrugereConnectionRepository getUsersConnectionRepository (ConnectionFactoryLocator connectionFactoryLocator) {returner ny InMemoryUsersConnectionRepository (connectionFactoryLocator); }}

Lad os omhyggeligt se på den nye konfiguration:

  • vi bruger en ProviderSignInController for at aktivere Facebook-godkendelse, som har brug for to ting:

    først, en ConnectionFactoryLocator registreret som en FacebookConnectionFactory med de Facebook-egenskaber, vi definerede tidligere.

    for det andet en InMemoryUsersConnectionRepository.

  • ved at sende en STOLPE til "/ log ind / facebook”- denne controller starter et bruger-login ved hjælp af Facebook-tjenesteudbyderen
  • vi opretter en SignInAdapter til at håndtere logiklogikken i vores applikation
  • og vi opretter også en ConnectionSignUp til at håndtere tilmelding af brugere implicit, når de først godkender med Facebook

6. Logonadapteren

Kort sagt, denne adapter er en bro mellem controlleren ovenfor - der driver Facebook-brugerens login-flow - og vores specifikke lokale applikation:

offentlig klasse FacebookSignInAdapter implementerer SignInAdapter {@Override public String signIn (String localUserId, Connection connection, NativeWebRequest request) {SecurityContextHolder.getContext (). setAuthentication (new UsernamePasswordAuthenticationToken (connection.getDisplayName (), null, Arrays.asRes. ")))); returnere null; }}

Bemærk, at brugere, der er logget ind med Facebook, har en rolle FACEBOOK BRUGER, mens brugere, der er logget ind med formular, har en rolle BRUGER.

7. Tilmeldingsforbindelse

Når en bruger godkender med Facebook for første gang, har de ingen eksisterende konto i vores applikation.

Dette er det punkt, hvor vi har brug for at oprette den konto automatisk for dem; vi bruger en ConnectionSignUp for at køre logikken for brugeroprettelse:

@Service offentlig klasse FacebookConnectionSignup implementerer ConnectionSignUp {@Autowired privat UserRepository userRepository; @ Override public String execute (Forbindelsesforbindelse) {Bruger bruger = ny bruger (); user.setUsername (connection.getDisplayName ()); user.setPassword (randomAlphabetic (8)); userRepository.save (bruger); returner user.getUsername (); }}

Som du kan se, oprettede vi en konto til den nye bruger - ved hjælp af deres Displaynavn som brugernavn.

8. Frontenden

Lad os endelig se på vores frontend.

Vi har nu støtte til disse to godkendelsesstrømme - form login og Facebook - på vores login side:

 Du er logget ud. Der opstod en fejl. Prøv igen 

Endelig - her er index.html:

Brugernavn

Log ud

Brugermyndigheder

Bemærk, hvordan denne indeksside viser brugernavne og autoriteter.

Og det er det - vi har nu to måder at godkende på applikationen.

9. Konklusion

I denne hurtige artikel lærte vi at bruge forår-social-facebook at implementere en sekundær godkendelsesstrøm til vores applikation.

Og selvfølgelig er kildekoden som altid fuldt tilgængelig på GitHub.