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. 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: Som du ser, opprettet vi en konto for den nye brukeren - ved hjelp av deres Visningsnavn som brukernavn. 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: Til slutt - her er index.html: Brukernavn 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å. 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.7. Registrering av tilkobling
@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 (); }}
8. Frontend
Du har blitt logget av. Det oppstod en feil. Vennligst prøv igjen
9. Konklusjon