En sekundær Facebook-pålogging med Spring Social

1. Oversikt

I denne opplæringen vil vi fokusere på å legge til en ny Facebook-pålogging i en eksisterende app for skjemainnlogging.

Vi kommer til å bruke vår sosiale støtte til å samhandle med Facebook og holde ting rene og enkle.

2. Maven-konfigurasjon

Først må vi legge til vår-sosial-facebook avhengighet til vår pom.xml:

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

3. Sikkerhetskonfigurasjon - Bare form innlogging

La oss først starte fra den enkle sikkerhetskonfigurasjonen der vi bare har formbasert autentisering:

@Configuration @EnableWebSecurity @ComponentScan (basePackages = {"com.baeldung.security"}) offentlig klasse SecurityConfig utvider WebSecurityConfigurerAdapter {@Autowired private UserDetailsService userDetailsService; @ Override beskyttet ugyldig konfigurasjon (AuthenticationManagerBuilder auth) kaster Unntak {auth.userDetailsService (userDetailsService); } @ Override-beskyttet ugyldig konfigurasjon (HttpSecurity http) kaster Unntak {http .csrf (). Deaktiver () .authorizeRequests () .antMatchers ("/ login *"). PermitAll () .anyRequest (). Autentisert (). Og ( ) .formLogin (). loginPage ("/ login"). permitAll (); }}

Vi kommer ikke til å bruke mye tid på denne konfigurasjonen - hvis du vil forstå det bedre, kan du ta en titt på skjemaets påloggingsartikkel.

4. Facebook-egenskapene

La oss deretter konfigurere Facebook-egenskaper i vår application.properties:

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

Noter det:

  • Vi må opprette en Facebook-applikasjon for å skaffe oss appId og appSecret
  • Fra innstillinger for Facebook-applikasjoner, sørg for å legge til plattform “Nettsted” og // lokal vert: 8080 / er "nettadressen"

5. Security Config - Legge til Facebook

La oss nå legge til en ny måte å autentisere på systemet - drevet av Facebook:

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

La oss se nøye på den nye konfigurasjonen:

  • vi bruker en ProviderSignInController for å aktivere Facebook-autentisering, som trenger to ting:

    først, a ConnectionFactoryLocator registrert som en FacebookConnectionFactory med Facebook-egenskapene vi definerte tidligere.

    andre, en InMemoryUsersConnectionRepository.

  • ved å sende en POST til "/ pålogging / facebook”- denne kontrolleren vil starte en brukerpålogging ved hjelp av Facebook-tjenesteleverandøren
  • vi setter opp en SignInAdapter for å håndtere påloggingslogikken i applikasjonen vår
  • og vi setter også opp en ConnectionSignUp å håndtere påmelding av brukere implisitt når de først godkjenner med Facebook

6. Påloggingsadapteren

Enkelt sagt, denne adapteren er en bro mellom kontrolleren ovenfor - som driver påloggingsflyten til Facebook - og vår spesifikke lokale applikasjon:

offentlig klasse FacebookSignInAdapter implementerer SignInAdapter {@Override public String signIn (String localUserId, Connection connection, NativeWebRequest request) {SecurityContextHolder.getContext (). setAuthentication (new UsernamePasswordAuthenticationToken (connection.getDisplayName (), null, ArraysGas Simple) Arrayer.as ")))); return null; }}

Merk at brukere som er pålogget med Facebook vil ha en rolle FACEBOOK BRUKER, mens brukere som er logget inn med skjema, vil ha en rolle BRUKER.

7. Registrering av tilkobling

Når en bruker autentiserer med Facebook for første gang, har de ingen eksisterende konto i applikasjonen vår.

Dette er punktet der vi trenger å opprette den kontoen automatisk for dem; vi skal bruke en ConnectionSignUp for å drive loggen for brukeroppretting:

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

Som du ser, opprettet vi en konto for den nye brukeren - ved hjelp av deres Visningsnavn som brukernavn.

8. Frontend

Til slutt, la oss ta en titt på frontend.

Vi skal nå ha støtte for disse to autentiseringsflytene - skjemainnlogging og Facebook - på påloggingssiden vår:

 Du har blitt logget av. Det oppstod en feil. Vennligst prøv igjen 

Til slutt - her er index.html:

Brukernavn

Logg ut

Brukermyndigheter

Legg merke til hvordan denne indeksen viser brukernavn og autoriteter.

Og det er det - vi har nå to måter å autentisere i applikasjonen på.

9. Konklusjon

I denne raske artikkelen lærte vi oss å bruke vår-sosial-facebook for å implementere en sekundær autentiseringsflyt for applikasjonen vår.

Og selvfølgelig, som alltid, er kildekoden tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found